はじめに
laravel案件で、load
とwith
という記述を見かけたので、どのような違いがあるかまとめさせていただきました。
laravelのバージョンは5.1を使っています。
Lazy Loading
loadとwithは以下のような「Lazy Loading」(怠惰な読込み)の問題を解決してくれます。
ユーザーテーブルusers
と投稿テーブルposts
が1対Nであったとして、
$posts = App\Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}
postsに10レコードあった場合、ユーザーの名前を取得するためにクエリ発行が10回されてしまい、効率的ではありません。
SELECT * FROM posts;
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE id = 2;
SELECT * FROM users WHERE id = 3;
‥
上記のような呼び出しは「Lazy Loading」(怠惰な読込み)と呼ばれます。
with
withは「Eager Loading」(熱心な読込み)と呼ばれ、効率的なクエリ発行をする機能です。
withを使えば、10回のクエリを1回にすることができます。
$posts = App\Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name;
}
以下のようなクエリが実行されます。
SELECT * FROM posts;
SELECT * FROM users WHERE id IN (1,2,3,4,5,‥)
load
loadは「Lazy Eager Loading」(怠惰で熱心な読込み)と呼ばれ、既に親モデルで検索した後に効率的な読込みを実施する機能です。
利用ケースは以下のようになります。
$posts = App\Post::all();
$posts->load('user');
先にpostで検索実行したことを「怠惰」として、その後に関連するuserに対し「熱心な読込み」を実施しています。
以下の記事を参考にさせていただきました。
https://laravel.com/docs/5.6/eloquent-relationships#eager-loading