【问题标题】: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 值对结果进行排序。

标签: mysql laravel eloquent laravel-eloquent laravel-query-builder


【解决方案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,因此您需要根据需要替换表名。
  • 你猜对了。问题是别的。感谢您的帮助。
猜你喜欢
  • 2017-04-11
  • 2021-12-15
  • 2021-06-20
  • 2021-06-17
  • 2016-07-01
  • 2018-04-05
  • 1970-01-01
  • 2016-02-26
  • 2018-12-09
相关资源
最近更新 更多