雄辩的查询以返回按二级关系排序的项目

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,因此您需要根据需要替换表名。 你猜对了。问题是别的。感谢您的帮助。

以上是关于雄辩的查询以返回按二级关系排序的项目的主要内容,如果未能解决你的问题,请参考以下文章

查询以获取按关系中的项目数排序的数据

laravel 雄辩的按关系排序

Laravel 通过属性获得雄辩的查询构建器关系

Laravel 和雄辩的返回结果来自多对多关系

雄辩的关系:只返回一个值而不是整行

Laravel 雄辩与查询构建器的优缺点