2019.11.08

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

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

Marvericks

SHORT MOVIES

株式会社マーベリックス
TEL:0466-66-8445
〒251-0035
神奈川県藤沢市片瀬海岸3丁目20-15

  • Instagram

マーベリックスは神奈川県藤沢、茅ヶ崎をベースに活動するホームページ制作会社です。

© Mavericks Inc.