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

时间:2016-05-28 13:15:39

标签: laravel laravel-5 eloquent laravel-5.2

我有2个型号; PostRating

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而不是对集合进行排序会对效率产生任何影响吗?

1 个答案:

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