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

标签 laravel laravel-5 eloquent laravel-5.2

我有 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/

相关文章:

php - PHP 中的::class 是什么?

php - Laravel - 如何传递数据以包含

php - 拉维尔 |具有保留键的PHP数组递归合并

laravel - 在 Scout 中使用更复杂的 where 子句

php - Laravel Blade 不尊重日期转换格式

laravel - 获取在 laravel 中至少拥有一篇帖子的所有用户

php - 获取 laravel 中每个服务器的最新状态

php - Laravel使用 Eloquent 关系选择链接表的最后一行

javascript - 如何在照片删除后重定向到模式 - Laravel

laravel-5 - 数组工厂 Laravel 上的随机选择值