如何使用Eloquent加入和求和?

Ari*_*ona 2 laravel eloquent

我需要在我的网站上选择大多数投票文章.现在,我有这个功能处理小错误但我把它写成原始SQL查询.错误就像,我得到了大多数带有原始SQL查询的投票文章,然后使用whereIn带有id的Eloquent的方法,但似乎它以随机顺序返回响应.此外,它会破坏->isEmpty()我在视图中大量使用的Eloquent 方法.

长话短说,我厌倦了编写原始查询并解决这个小脚本上的大量错误(或副作用).我想把它带到Eloquent(有关系)并完成它.

我当前的数据库架构:

articles
--id

votes
--id
--user
--article_id
--vote
Run Code Online (Sandbox Code Playgroud)
  1. Articles.id并且votes.article_idhasMany(一篇文章可能有很多票)相关
  2. vote列可能只包含1-1值.
  3. 我需要运行一个查询,选择前10个最正面的投票文章.在原始的sql中,它是group by votes.article_id order by sum(votes.vote)(我们不选择正投票,而是选择投票的SUM.vote列.)

例如:

articles.id
1
2

votes.id      votes.user       votes.article_id      votes_vote
1             User1            1                     1
2             User2            1                     1
3             User3            1                     -1 (this is negative vote)
4             User1            2                     1
5             User2            2                     1
Run Code Online (Sandbox Code Playgroud)

输出应该是:

Article 2 has (2) vote rating. // 1 + 1
Article 1 has (1) vote rating  // 1 + 1 - 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

PS.DB::raw如果你愿意,你可以使用Eloquent的方法,只要它使用Eloquent.

Jar*_*zyk 5

Article::leftJoin(
    DB::raw('(SELECT article_id, SUM(vote) AS votes FROM votes GROUP BY post_id) as v'),
    'v.post_id', '=', 'posts.id'
)->orderBy('votes', 'desc')->take(10)->get();
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.采取虚拟拥抱.<3 (2认同)