我有 2 个模型; 发布
和评分
Rating
模型包含一个 amount
列,它指定某事物的评级有多高。这是基于 5 星评级,因此金额可以是 1-5 之间的值
Post
模型与评级模型和称为 Ratings
的函数具有一对多关系,该函数返回 hasMany。
我想根据平均评分获取 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 而不是对完整集合进行排序。
子问题:用 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');
关于laravel - 按一对多相关表列的平均值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499462/