[解決済み] laravel with() メソッドと load() メソッドの比較
質問
の違いを理解するために、私は本当に
with()
メソッドと
load()
というメソッドがありますが、よく理解できませんでした。
私が思うに、このメソッドを使用すると
with()
メソッドを使用することは、リレーションを熱心に読み込むので、より良いことです"quot;。もし私が
load()
メソッドを使うのと同じようにリレーションをロードします。
hasMany()
(を使うのと同じように(あるいはオブジェクト間の関係に関係する他のメソッド)、リレーションを読み込みます。
間違っているのでしょうか?
どのように解決するのですか?
どちらも同じ最終結果、つまり最初のモデルに関連するモデルを熱心にロードすることを達成します。実際、両方ともまったく同じ 2 つのクエリを実行します。重要な違いは
with()
は最初のクエリの直後に関連するモデルをロードすることです (
all()
,
first()
または
find(x)
など); を使う場合
load()
を使う場合、最初に最初のクエリを実行し、後のある時点でリレーションを読み込むようにします。
ここでいう「Eager」とは、特定の結果セットに対してすべての関連するモデルを関連付けることを意味します。 をたった一つのクエリで関連付けることを意味します。 を実行しなければならないのとは対照的に n クエリを実行する必要があります。 n は初期セットのアイテム数です。
を使った熱心な読み込み
with()
を使って読み込むと
with()
のように、例えば
$users = User::with('comments')->get();
...ユーザが5人の場合、次の2つのクエリがすぐに実行されます。
select * from `users`
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)
...そして、ユーザーモデルにコメントを付けたモデルのコレクションが出来上がるので、以下のようなことが出来ます。
$users->comments->first()->body
.
Lazy"イーガーローディングは
load()
あるいは、2つのクエリを分離して、まず最初の結果を取得します。
$users = User::all();
が実行されます。
select * from `users`
そして後で、これらすべてのユーザーの関連コメントが必要だと判断した場合、それらを後から熱心に読み込むことができます。
$users = $users->load('comments');
で、2番目のクエリを実行します。
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)
...と、2つのステップに分かれただけで、同じ結果に終わります。ここでも
$users->comments->first()->body
を呼び出して、任意のアイテムの関連モデルにアクセスすることができます。
なぜ
load()
vs.
with()
?
load()
を使うと、2つ目のクエリを実行する必要があるかどうかを、動的な条件に基づいて後で決定することができます。しかし、関連するすべての項目にアクセスする必要があることに疑問の余地がない場合は、次のようにします。
with()
.
これらの方法の代わりに、最初の結果セットをループして
hasMany()
リレーションをクエリすることです。この場合、最終的に
n+1
クエリ、あるいは
6
である。イーガーローディングは、前もって
with()
を使うか、後で
load()
のみが実行されます。
2
クエリを実行します。
関連
-
[解決済み] PHP Composerを使ってLaravelからパッケージを削除するにはどうしたらいいですか?
-
[解決済み] LaravelはMcrypt PHPエクステンションを必要とします
-
[解決済み] Laravelで特定のマイグレーションをロールバックする
-
[解決済み】Laravel 5 - URLからパブリックを削除する
-
[解決済み] Laravel. リレーションを持つモデルでscope()を使用する
-
[解決済み] Laravelで「キャッシュのクリアに失敗しました。適切なパーミッションがあることを確認してください"
-
[解決済み] Laravel Eloquent - 1つの行を取得する
-
[解決済み] LaravelではbelongsToとhasOneのどちらを使うべきですか?
-
[解決済み] laravel Unable to prepare route ... for serialization. クロージャを使う
-
[解決済み] Laravel Queue システムをサーバー上で動作させる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Laravelで「キャッシュのクリアに失敗しました。適切なパーミッションがあることを確認してください"
-
[解決済み] Laravel Eloquent - distinct() と count() が正しく動作しない。
-
[解決済み] パブリックディレクトリを取得するには?
-
[解決済み] Laravel Migrationsから特定のファイルをMigrateする
-
[解決済み] LaravelのBladeテンプレートで、レイアウトに変数を渡すには?
-
[解決済み] laravel Unable to prepare route ... for serialization. クロージャを使う
-
[解決済み] Laravel Queue システムをサーバー上で動作させる方法
-
[解決済み] ピボットテーブルのデータ添付でタイムスタンプが更新されない
-
[解決済み] Laravel 4: SQLを実行するには?
-
[解決済み] ファースト・オア・クリエイト