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

如何在 laravel 中实现 vuetify?

如何使用 Laravel 在网站中实现 OCR

如何在 Laravel 网站中实现主题选项?

如何在 laravel 5.1 中实现“记住我”?

如何在 laravel 中实现这个查询?

如何在 Laravel 中实现管理面板和客户面板