はlaravel /雄弁前回のクエリ結果を覚えていないか、パフォーマンスへの影響があります:laravelはすべてのクエリ結果をキャッシュしますか?代わりに、変数に値を入れるのも私のアクセス関連のモデルを複数回
$user = User::find(1);
$relatedModelId = $user->relation->id
doSomething($relatedModelId)
doSomethingElse($relatedModelId)
はlaravel /雄弁前回のクエリ結果を覚えていないか、パフォーマンスへの影響があります:laravelはすべてのクエリ結果をキャッシュしますか?代わりに、変数に値を入れるのも私のアクセス関連のモデルを複数回
$user = User::find(1);
$relatedModelId = $user->relation->id
doSomething($relatedModelId)
doSomethingElse($relatedModelId)
対
$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();
雄弁は関係をキャッシュします。関係の有効な場合に使用するに注意してください - あなたは、新しいクエリが、例えば実行しまいますそうするたびに:
$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クエリが実行される可能性がありますこの関係の場合