雄辩的查询以返回按二级关系排序的项目
Posted
技术标签:
【中文标题】雄辩的查询以返回按二级关系排序的项目【英文标题】:Eloquent query to return items ordered by second level relation 【发布时间】:2017-09-23 08:03:15 【问题描述】:我正在尝试构建一个查询,该查询将返回项目的记录及其关系。但是,它需要按二级关系排序。而且,它还需要分页。
以下是模型和关系:
class FirstModel extends Model
public function secondModel()
return $this->hasMany(SecondModel::class);
class SecondModel extends Model
public function firstModel()
return $this->belongsTo(FirstModel::class);
public function thirdModel()
return $this->belongsToMany(ThirdModel::class);
class ThirdModel extends Model
public function secondModel()
return $this->belongsToMany(SecondModel::class);
第一个模型与第二个模型具有一对多关系(第二个模型表具有第一个模型 ID 的字段)。
第二个模型与第三个模型具有多对多关系(使用具有第一个模型 ID 和第二个模型 ID 的数据透视表)。
所需的返回值是按 ThirdModel id 排序的 FirstModel 项的集合。
我如何使用 Eloquent 或 Laravel 的 DB Query builder 完成这个查询?
谢谢。
【问题讨论】:
如果FirstModel
有很多SecondModel
并且SecondModel
有很多(多对多)ThirdModel
,那么ThirdModel
id 应该由哪个FirstModel
排序?第一个 SecondModel
关系中的第一个?
id 最低的那个(如果我们坚持使用 ASC)。这个想法是通过第三个模型 id 值对结果进行排序。
【参考方案1】:
要实现您所描述的,您将不得不使用查询构建器并跨表执行连接。
执行此操作时,您还需要对使用软删除的模型保持警惕,并使用whereNull('deleted_at')
子句自行处理已删除模型的检查。我已经在我的示例中将这些注释掉了。
$firsts = FirstModel::select('first_models.*')
->join('second_models', 'first_models.id', '=', 'second_models.first_model_id')
->join('second_models_third_models', 'second_models.id', '=', 'second_models_third_models.second_model_id')
->join('third_models', 'third_models.id', '=', 'second_models_third_models.third_model_id')
//->whereNull('second_models.deleted_at')
//->whereNull('third_models.deleted_at')
->orderBy('third_models.id', 'asc')
->groupBy('first_models.id')
->paginate(10);
我倾向于将此查询移动到查询范围内,以保持控制器整洁并便于将来重用。
【讨论】:
完美。谢谢,@fubar 在使用 groupBy 时,我得到了一个错误。它说myDB.first_models.id' isn't in GROUP BY
。知道为什么吗?
我假设FirstModel
的表名是first_models
,因此您需要根据需要替换表名。
你猜对了。问题是别的。感谢您的帮助。以上是关于雄辩的查询以返回按二级关系排序的项目的主要内容,如果未能解决你的问题,请参考以下文章