さあ、未来へ旅立とう

日々のこと、チーム紹介

  • 8 Nov. 2019

    【Laravel】リレーションとEager loadingについて

    CATEGORYBlog TAG

    Eager loadingについてはなんかたくさんアクセスしちゃってなんか負荷があまり良くない?みたいなふわふわな情報しかなかったのでちょっくら調べてみたので共有する。

    リレーションは大変便利でスマートにコードをかけるのですがデータベース的には不可になっています。

    例えばClass::allで全てのClassを出力しそこから一致したnameをforeachで取り出す。
    というやり方ですがデータベース自体が少なければ問題ないのですが、データの量が膨大になれば話は別です。

    Class::allでクエリを1回発行し、そのあとにClass::allをforeachでN回発行される。

    10件あれば11回クエリが発行され、1000個あれば1001回という感じ。

    $classes = Class::all(); //クエリを1回発行したあと、
    foreach ($classes as $class) {
      echo $class->user->name; //classがN回発行される。
    }
    

    これがN+1問題というらしい。なんか名前がかっこいい。

    https://readouble.com/laravel/5.6/ja/eloquent-relationships.html
    のEagerロード

    $classes = Class::with('user')->get(); //2回ですむ
    foreach ($classes as $class) {
      echo $class->user->name;
    }
    

    参考
    https://qiita.com/shosho/items/abf6423283f761703d01
    https://qiita.com/tmf16/items/b9dd262c7738472c86d9

    まとめ

    フロントエンドと違った難しさがPHPにはありますね。
    またひとつ新しいことを学びました。Laravelって難しい。

    女性だらけのハーレムを探し、たどり着いたここ湘南!常に調味料を切らし、今日は貴女の部屋へ!毎日コーフンして寝不足気味の強者ジプシー。