如何在 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()?的主要内容,如果未能解决你的问题,请参考以下文章