如何在 Laravel 关系中实现 SUM()?
Posted
技术标签:
【中文标题】如何在 Laravel 关系中实现 SUM()?【英文标题】:How can I implement SUM() in Laravel relations? 【发布时间】:2018-08-05 06:54:35 【问题描述】:这是我的查询,也可以:
SELECT sum(r.rating) as rank,b.* FROM books as b
LEFT JOIN ranks as r ON b.id = r.book_id
WHERE 1
GROUP BY (b.id)
ORDER BY rank DESC
现在我想在 Laravel 中做同样的事情。这是我尝试过的:
// Book model
class Book extends Model
public function ranks()
return $this->hasMany(Rank::class)->sum("rating");
// Controller
$obj = new Book;
$get = $obj->ranks()->orderBy('rating', 'desc')->get();
它会抛出这个错误:
在整数上调用成员函数 groupBy()
知道如何解决这个问题吗?
【问题讨论】:
您可能会在这里找到答案:***.com/questions/28267550/… 【参考方案1】:public function ranks()
return $this->hasMany(Rank::class)
->select('book_id', \DB::raw('sum(`rating`) as `rank`'))
->groupBy('book_id');
$books = Book::with('ranks')->get();
$sortedBooks = $books->sortByDesc(function($book)
return $book->ranks->sum('rank');
);
【讨论】:
这不是将所有Book
模型加载到内存中然后排序吗?这可能会导致高内存使用。最好在数据库层进行排序。
你的意思是Rank
模特吗?
不,我指的是Book
型号。假设有 1000 本书,而您只想要排名最高的 10 本书。然后你需要加载 1000 个 Book
+ 他们的 Ranks
才能对 10 个最好的进行排序。
是的,但问题不是这个。以上是关于如何在 Laravel 关系中实现 SUM()?的主要内容,如果未能解决你的问题,请参考以下文章