我有一个Project表和一个数据透视表" like_project"它有2列:user_id和project_id,因此用户可以喜欢Projects
我试图列出所有项目并按喜欢的数量排序,使用" has"方法,像这样:
$projects = Project::has('likes')->paginate(10);
问题在于我不知道如何通过喜欢的数量订购,我在我的项目模型上有一个功能来计算项目的喜欢数量:
public function getTotalLikes(){
return sizeof($this->likes()->getRelatedIds()); //I could use $this->likes()->count()
}
答案 0 :(得分:0)
除非您想要编写一个长SQL查询来运行GROUP / ORDER BY命令,否则我只需在重新启动项目后运行eloquent collection的排序方法。
$projects->sort(function($project) {
return $project->likes->count();
});
答案 1 :(得分:0)
这取决于您的喜好是如何准确存储的,但最直接的方式是简单连接(假设MySQL):
$projects = Project::join('like_project as lp', 'lp.project_id', '=', 'projects.id')
->groupBy('projects.id')
->orderByRaw('count(lp.project_id) desc')
->select('projects.*') // and if needed: DB::raw('count(lp.project_id) as likesCount')
->paginate(10);