LoginSignup
1
0

More than 5 years have passed since last update.

Laravel5のwithが思っていた以上に高性能

Posted at

注意:ある程度LaravelのEloquentについてわかっている前提で書いてます。

関連したEloquentを取ってくるのにクエリの数を減らすためにwithを使いますが
思っていた以上に複雑なことができることを知ったので書き留めておきます。
ちなみに使用しているのはLaravel 5.1です

Reservation 予約情報
ReservationDay 日毎の予約情報
Room 部屋

例として上記のようなテーブル構成で
Reservationに対して日毎にReservationDayが存在し
ReservationDayにRoomが紐付いている構成です。

特定日の予約を一覧で表示するページでかつ
日毎の予約情報も必要な場合はwithを使って
特定日に絞った条件で取得することができます。
さらにwithの中でwithだってできます。

$date = '2016-12-01';
$reservations = Reservation::where('start_date', '<=', $date)
                           ->where('end_date', '>=', $date)
                           ->with([
                               'reservationDay' => function($query) use ($date){
                                   $query->whereStayDate($date)->with('room');
                               },
                           ])
                           ->get();

まぁReservationRoomが1件だけ必ず存在すると担保していても
1件ではなく複数件として認識されるところはどうにもできなかったので

@foreach ($reservations as $reservation)
  @var ('reservationRoom', $reservation->reservationDay->first())

こんな感じでView側で変数再定義しちゃってます。
@var部分はBladeを拡張して変数定義できるようにしたやつなので
需要があればで書くかもしれませんが今回は割愛します。

あとがき
記事用に書き直しながら思ったけど
もしかしてreservationDayのところhasManyではなくhasOneで別で定義してやれば
いちいちfirstで1レコード分を変数に定義しなおさなくてもいけるのか?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0