Eloquent 查询 return 个按二级关系排序的项目

Eloquent query to return items ordered by second level relation

我正在尝试构建一个查询,该查询将 return 记录项目及其关系。但是,它需要通过二级关系进行排序。而且,还需要分页。

以下是模型和关系:

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);
    }
}

第一个模型与第二个模型存在一对多关系(第二个模型 table 具有第一个模型 ID 的字段)。

第二个模型与第三个模型存在多对多关系(使用具有第一个模型 ID 和第二个模型 ID 的枢轴 table)。

所需的 return 将是按 ThirdModel id 排序的 FirstModel 项目的集合。

如何使用 Eloquent 或 Laravel 的数据库查询构建器完成此查询?

谢谢。

要实现您所描述的内容,您将不得不使用查询构建器并跨表执行联接。

执行此操作时,您还需要警惕使用软删除的模型,并使用 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);

我倾向于将此查询移动到查询范围内,以保持您的控制器整洁并便于将来重复使用。