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

Posted

技术标签:

【中文标题】按一对多相关表列的平均值排序【英文标题】:Sort by average value of an one to many related table column 【发布时间】:2016-05-28 13:15:38 【问题描述】:

我有 2 个模型; PostRating

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 而不是对 FULL 集合进行排序是否可行。

子问题:使用 Eloquent 执行此操作而不是对集合进行排序会对效率产生影响吗?

【问题讨论】:

【参考方案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');

【讨论】:

感谢您的回复。即使这不是我想要的(以我希望已经实现的方式来执行此操作)我会使用它,因为我相信它会比对每个帖子的集合进行排序更好(尤其是从长期来看,可能有数千个帖子)

以上是关于按一对多相关表列的平均值排序的主要内容,如果未能解决你的问题,请参考以下文章

在一对多映射中使用休眠条件(以行表列作为搜索条件之一的搜索标题表)

核心数据:在一对多关系中按日期属性排序

Swift - 一对多排序

Laravel Nova 排序一对多显示重复

根据一对多关系的值对集合进行排序

如果一个表有一个未索引列与索引列是一对多的关系,如何优化未索引列的查询?