16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

laravelのwithとloadの違い

Last updated at Posted at 2018-09-08

はじめに

laravel案件で、loadwithという記述を見かけたので、どのような違いがあるかまとめさせていただきました。
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

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?