Eager Loading

概要

リレーション先の情報を取得する際には、N+1問題が発生するので、EagerLoading Withメソッドを使い取得する必要がある。

画像一覧のindex.bladeを確認すると
:filename="$product->imageFirst->filename"
とリレーションでリレーション先の情報を取得している

SQLを確認すると
画像が表示されている情報分SQLが発行されて折り、画像が1000件なら1000回SQLが発行されてパフォーマンス落ちる
→N+1問題

N + 1問題の対策

→EagerLoading

readouble.com

リレーション先のリレーション情報を取得 withメソッド、リレーションをドットでつなぐ
‘id’, Auth::id()をwhereすることでログインしているOwnerをgetできる。
$ownerInfo = Owner::with(‘shop.product.imageFirst’) ->where(‘id’, Auth::id())->get();

$ownerInfoをforeachで回してview側で確認していく dd($owner->shop->product);を確認すると、productが5つ表示されていて、これを1つずつ表示する必要があるので、さらにforeachをかく。

ownerに紐付いたproduct情報を表示。
dd($product->imageFirst->filename);を確認すると、画像が取得されてるとわかる。

<?php
foreach($ownerInfo as $owner)
dd($owner->shop->product);
  foreach($owner->shop->product as $product)
  {
     dd($product->imageFirst->filename);
   }
foreachをview側で実装する


→発行されているSQLを確認すると
select * fromimageswhereimages.idin (1, 2, 3, 4)と1つにまとまっていることがわかる。