3

我试图建立一个查询,它将返回与它的关系项目的记录。但是,它需要通过二级关系进行排序。而且,它也需要分页。雄辩的查询返回按第二级关系排序的项目

下面是模型和关系:

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的数据库查询生成器来完成此查询?

谢谢。

+0

如果'FirstModel'有很多'SecondModel'并且'SecondModel'有很多(多对多)'ThirdModel',那么'FirstModel'应该按照什么顺序排列'ThirdModel'?第一个'SecondModel'关系中的第一个? – fubar

+0

最低ID(如果我们坚持使用ASC)。这个想法是通过第三个模型ID值对结果进行排序。 – crabbly

回答

2

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

这样做时,您还需要对使用软删除的模型保持警惕,并使用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); 

我会倾向于这个查询进入查询范围,让您的控制器整齐,以便于以后的再利用。

+0

完美。谢谢,@fubar 使用groupBy时,我得到一个错误。它说'myDB.first_models.id'不在GROUP BY中。任何想法为什么? – crabbly

+0

我假定'FirstModel'的表名是'first_models',所以您需要根据情况替换表名。 – fubar

+0

你假设正确。问题是别的。 Thx为您提供帮助。 – crabbly