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