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って難しい。