我有两个模型;Post
和Rating
Rating
模型包含一个amount
列,用于指定某个事物的评级有多高。这是基于五星评级,因此金额可以是1-5 之间的值
Post
模型与评级模型和返回hasMany的函数Ratings
具有一对多关系。
我想根据平均评分得到最新的5篇帖子。对于平均评级,我创建了一个可以在下面看到的函数
注意:复数(Ratings)返回hasMany关系,其中单数(Rating)返回的值是平均评级
public function Rating(){
return floor($this->Ratings()->avg('rating'));
}
是否可以使用Eloquent QueryBuilder检索按平均评级排序的帖子?
目前,我正在检索所有帖子,然后对收集对象使用sortBy方法,以获得平均评分最高的帖子。我这样做的方式可以在下面看到。
$posts = Post::all();
$posts = $posts->sortByDesc(function ($post, $key) {
return $post->Rating();
});
现在,如果我只想展示5,我仍然需要检索和排序所有看起来不太友好的资源(在我看来。我没有任何证据,也没有说这是真的)。
所以我的问题是:使用Eloquent而不是对FULL集合进行排序是否可行
子问题:使用Eloquent而不是对藏品进行排序会对效率产生影响吗?
您可以使用查询生成器
DB::table('post')
->select('post.id', 'AVG(rating.amount)')
->join('rating', 'post.id', '=', 'rating.post_id')
->groupBy('post.id')
->orderByRaw('AVG(rating.amount) DESC');