Laravel 5顺序关系计数和分页


Laravel 5 orderBy relationship count and pagination

我在一个链接分享网站工作,需要根据他们的投票来排序链接。

我有一个'links'表和一个link_votes表。

link_votes表有一个链接表'id'字段的'link_id'引用字段。

我的链接模型中有一个hasMany关系:

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

返回link_votes表中的所有行(每一行代表一次投票)。

我的标准查询获得我所有的链接,并按创建日期排序是:

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

我现在想做的是按投票数排序我的链接。

我现在拥有的是:

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

这是有效的,但几乎太好了。通过使用vote_type字段,我在link_votes表中有两种类型的投票。如果投票是赞成,则类型为1,但如果是反对,则类型为2。

这里的问题是通过按投票计数排序,它将所有投票作为计数,并将否决票放在那些没有任何投票的链接上方。

我需要找到一种排序的方法,通过upvotes (vote_type = 1)减去downvotes (vote_type = 2)的总和。

在我看来,我是通过计算来显示投票数的。

逻辑的改变使我比最初想象的更容易做到这一点。

我所需要做的就是把积极的(赞成)作为排序的计数,因为它们是唯一重要的。

为此,我将withCount更改为:

$links = Link::withCount([
        'votes' => function ($query) {
            $query->where('vote_type', 1);
        }
    ])
    ->orderBy('votes_count', 'desc')
    ->paginate(10);