Eager Loading
概要
リレーション先の情報を取得する際には、N+1問題が発生するので、EagerLoading Withメソッドを使い取得する必要がある。
画像一覧のindex.bladeを確認すると
:filename="$product->imageFirst->filename"
とリレーションでリレーション先の情報を取得している
SQLを確認すると
画像が表示されている情報分SQLが発行されて折り、画像が1000件なら1000回SQLが発行されてパフォーマンス落ちる
→N+1問題
N + 1問題の対策
→EagerLoading
リレーション先のリレーション情報を取得 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 * from
imageswhere
images.
idin (1, 2, 3, 4)
と1つにまとまっていることがわかる。