2017-05-09 4 views
0

Laravel Eloquent - ORMを使用して遠くに関連するモデルにWhere条件を追加する方法私は現在、次のを持っている

Cars::with('cases')->with(['parts', 'parts.engines', 'parts.engines.metals']) 
        ->orderBy('car_name', 'DESC')->orderBy('id', 'DESC'); 

上記は、これらの車のそれぞれにエンジンに関連付けられている金属と一緒に私のcarsテーブル内のすべての行が一覧表示されます。 metalsテーブルは、テーブルと、partsテーブルと、enginesテーブルを介して関連付けられています。その最初のパラメータの配列を受け付けませんので、whereHas()

Cars::with('cases')->whereHas(['parts', 'parts.engines', 'parts.engines.metals'], function($query){ 
    $query->where('weight', '=', 45) 
})->orderBy('car_name', 'DESC')->orderBy('id', 'DESC'); 

しかし、このエラーが出て、私はそれと遠い関係にリンクする方法が表示されない:

私が使って試してみました。

組み込みのORMを使用してmetalsテーブルの列にWHERE条件を適用するにはどうすればよいですか?私はあなたがこの意味を考える

答えて

1

whereHas()はあなたが条件を追加したい対象の関係の名前を必要とします。したがって、金属に条件を追加しようとしている場合は、parts.engines.metals関係を制限するだけです。

ネストされたリレーションシップを読み込もうとすると、中間リレーションシップをロードするために指定する必要もありません。つまり、熱心な負荷parts.enginesを使用する場合は、熱心な負荷partsは必要ありません。

だから、あなたのクエリのようなものになります、このクエリのみを取得されたものの車のために、さらに45の重量との関連金属を持っている車を取得します

Cars::with(['cases', 'parts.engines.metals']) 
    ->whereHas('parts.engines.metals', function($query) { 
     $query->where('weight', '=', 45) 
    }) 
    ->orderBy('car_name', 'DESC') 
    ->orderBy('id', 'DESC'); 

をそれは熱心にもなりますそれらの車に関連するケース、パーツ、エンジン、および金属のすべてをロードします。

-1

Cars::with(['cases', 'parts', 'parts.engines', 'parts.engines.metals' => function($query){ 
$query->where('weight', '=', 45); 
}])->orderBy('car_name', 'DESC')->orderBy('id', 'DESC'); 
+0

熱心なローディングに条件を追加すると、すべての車に熱心に負荷されている金属だけが制限されます。 OPは、whereHas()メソッドを使用する関連金属の条件に基づいて検索される自動車を制限したいと考えています。 – patricus

関連する問題