2017-12-26 18 views

答えて

0

$user = User::find(1); 
doSomething($user->relation->id) 
doSomethingElse($user->relation->id) 

あなたが」リレーションを持つ1つのオブジェクトだけを使用すると、コードを変更する必要はありません。

しかし、関係のあるオブジェクトのコレクションをロードする場合、N + 1の問題を避けるためにeager loadingを使用する必要があります。

Eloquentリレーションシップにプロパティとしてアクセスする場合、リレーションシップデータは「遅延ロード」されます。つまり、最初にプロパティにアクセスするまで、関係データは実際にロードされません。しかし、Eloquentは、親モデルに照会するときに関係を "熱心に読み込む"ことができます。熱心な読み込みは、N + 1のクエリ問題を緩和します。

https://laravel.com/docs/5.5/eloquent-relationships#eager-loading

だから、すべての関連データをプリロードするwith()メソッドを使用します。あなたが示したように、可変に関係を割り当てる必要はありませんので、

$users = User::with('relation')->get(); 
0

雄弁は関係をキャッシュします。関係の有効な場合に使用するに注意してください - あなたは、新しいクエリが、例えば実行しまいますそうするたびに:

$user = User::find(1); 
doSomething($user->relation->id); 
doSomethingElse($user->relation->id); 

のみ単一のクエリは、関係のために実行されますが、

$user = User::find(1); 
doSomething($user->relation->id); 
doSomethingElse($user->RELATION->id); 

2クエリが実行される可能性がありますこの関係の場合

関連する問題