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);
我倾向于将此查询移动到查询范围内,以保持您的控制器整洁并便于将来重复使用。
我正在尝试构建一个查询,该查询将 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);
我倾向于将此查询移动到查询范围内,以保持您的控制器整洁并便于将来重复使用。