Help us understand the problem. What is going on with this article?

Laravelのwith()とload()

More than 1 year has passed since last update.

概要

Laravelのwith()とload()についてどう使い分けるのかわからなかったので調べて理解したことを書く。公式ドキュメントを参考にしているのでそちらも併せて確認するとより理解が深まると思う。

共通していること

どちらもリレーションを解決したい時に使用する。取得できる結果は両者同じ。
それらが故に使っている時に混乱したわけでもあるが。

違っている部分

あだ名

with()の方は、Eager Loadingと呼ばれ、
load()の方は、Lazy Eager Loadingと呼ばれる。

メソッドを使う位置

with()はget()とかall()とかの終端操作の前に使用する。

withの使い方
$books = App\Book::with('author')->get();

load()は終端操作の後に使用する。例ではall()の後でload()を行っている。

loadの使い方
$books = App\Book::all();

if ($someCondition) {
    $books->load('author', 'publisher');
}

使い分け

実際動くなら取得結果が変わらないしどっちを使ってもいいよね、と思ったが自分なりに使い分ける方法を考えた。
with()は共通して連結される場合に利用し、loadは共通ではない連結条件の指定に利用すると見通しの良いコードにすることができると思う。

以下でシミュレーションをする。
ニューステーブル - タグテーブル - カテゴリ(大分類)テーブルというリレーションがあることを想定する。ニュースがどのカテゴリに属すかを取得するためにはタグテーブルを介さないといけない。
ここで、カテゴリがスポーツに属するデータとテクノロジに属するデータを取得するためには以下のようにする。

$news   = News::with(タグテーブルとの連結)->get();
$sports = $news->load(カテゴリがスポーツに属すような連結);
$tech   = $news->load(カテゴリがテクノロジに属すような連結);

ニュースに紐づくカテゴリを取得するためには、タグテーブルの連結は共通しているので、with()で連結させる。そして、スポーツに属する、などの連結の情報は場合によるためload()を利用する。このload()の中身を差し替えるだけでコンテキストにあった記述ができて、コードの見通しが良くなると思う。

参考

https://laravel.com/docs/5.2/eloquent-relationships#eager-loading

mk-tool
舞浜のエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away