按一对多相关表列的平均值排序



我有两个模型;PostRating

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');

最新更新