【问题标题】:Laravel 5 orderBy relationship count and paginationLaravel 5 orderBy 关系计数和分页
【发布时间】:2017-03-25 03:23:11
【问题描述】:

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

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

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

我的 Link 模型中有一个 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 表中有 2 种投票类型。如果投票是赞成票,则其类型为 1,但如果投票反对,则其类型为 2。

问题就在这里,通过按票数排序,将所有票数作为计票数,并将反对票的票数放在没有任何票数的链接上方。

我需要找到一种按赞成票 (vote_type = 1) 减去反对票 (vote_type = 2) 的总和进行排序的方法。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    为此,我将 withCount 更改为:

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

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 2022-01-16
      • 2014-08-04
      • 2015-06-10
      • 2018-09-16
      • 1970-01-01
      • 2015-12-29
      • 2021-10-13
      • 2021-07-01
      相关资源
      最近更新 更多