我有2个型号; Post
和Rating
Rating
模型包含amount
列,用于指定评分的高度。这是基于5星评级,因此金额可以是1-5的值
Post
模型与评级模型和名为Ratings
的函数有一对多关系,返回hasMany。
我想根据平均评分获得5条最新帖子。对于平均评级,我创建了一个可以在下面看到的函数
注意:复数(评级)返回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而不是对集合进行排序会对效率产生任何影响吗?
答案 0 :(得分:1)
您可以使用查询构建器
DB::table('post')
->select('post.id', 'AVG(rating.amount)')
->join('rating', 'post.id', '=', 'rating.post_id')
->groupBy('post.id')
->orderByRaw('AVG(rating.amount) DESC');