1. ホーム
  2. laravel

[解決済み] laravel with() メソッドと load() メソッドの比較

2023-06-05 07:19:08

質問

の違いを理解するために、私は本当に 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 クエリを実行します。