2016-11-10 10 views
1

リンク共有サイトで作業しており、リンクを投票順に並べる必要があります。Laravel 5 orderBy関係数とページ番号

私は 'リンク'テーブルとlink_votesテーブルを持っています。

link_votesテーブルには、リンクテーブルの「id」フィールドへの「link_id」参照フィールドがあります。

は、私は私のリンクモデルにhasManyの関係を持っている:

public function votes() 
{ 
    return $this->hasMany('\App\LinkVote'); 
} 

は、これは彼がテーブルをlink_votes int型(各行は、単一の投票をある)すべての行を返します。作成日によってすべての私のリンクと順番にそれらを取得する

私の標準クエリは次のとおりです。私が今したい何

$links = Link::withCount('votes')->orderBy('votes_count', 'desc')->paginate(10); 

彼らが持っている票の量によって私のリンクを注文です。

私が現在持っていることは次のとおりです。

$links = Link::orderBy('created_at', 'desc')->with('votes')->paginate(20); 

これは動作しますが、ほとんどあまりにもよく。私は、link_typeフィールドを持つことで、link_votesテーブルに2種類の投票を持っています。投票がアップヴォートの場合、そのタイプは1であるが、そのタイプが2の場合。

問題は投票数で注文することにより、すべての投票をカウントし、投票権のないリンク。

upvotes(vote_type = 1)からdownvotes(vote_type = 2)を差し引いた合計で注文する方法を見つける必要があります。

私の見解では、その数学を行うことで投票数を示しています。

答えて

1

ロジックの変更により、これは最初の考えよりも簡単に実行できました。

私がする必要があったのは、彼らが重要な唯一のものであるため、注文するカウントとしてポジティブ(upvotes)をカウントすることでした。

$links = Link::withCount([ 
     'votes' => function ($query) { 
      $query->where('vote_type', 1); 
     } 
    ]) 
    ->orderBy('votes_count', 'desc') 
    ->paginate(10); 
:私はwithCountを変更した。これを行うために

関連する問題