Laravel 5 orderBy关系计数和分页

时间:2016-11-10 23:26:23

标签: php laravel laravel-5 relationship laravel-5.3

我在链接共享网站上工作,需要通过他们的投票来订购链接。

我有一个'链接'表和一个link_votes表。

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

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

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

这将返回所有行(每行是单一投票)int link_votes table。

我的标准查询获取所有链接并按创建日期订购它们是:

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

我现在要做的是按照他们的票数来订购我的链接。

目前我所拥有的是:

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

这很有效,但差不多。我有一个投票类型字段,在我的link_votes表中有两种类型的投票。如果投票是upvote它的类型为1但是如果它是downvote它的类型为2.

这个问题是通过投票计数来命令它将所有选票作为一个计票,并将投票以负面投票高于那些没有任何选票的链接。

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

在我看来,我通过数学运算来显示投票数。

1 个答案:

答案 0 :(得分:1)

逻辑的改变让我比以前更容易做到这一点。

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

要做到这一点,我已将withCount更改为:

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