1

私は Cake 2.3.8 を使用していますが、データを効率的に検索するのに少し苦労しています。探しているデータを取得していますが、収容物のために不要なものもたくさんあります。

たとえば、次のテーブルがあるとします

table reservations
id  |  confirmation_number   |   guest_id
1         123                        1
2         345                        2

table reservation_details -a reservation can have multiple entries (multiple rooms)
id  |  reservation_id   |   date     |  time   | room_id    |   rate
 2           1            2014-18-04    13:00        1           9.99
 4           1            2014-18-04    14:00        2           4.99
 5           2            2014-19-04    13:00        2           4.99

以下のモデルで

 //Reservation model
 public $actsAs = array('Containable');
 public $hasMany = array('ReservationDetail');

 //ReservationDetail model
 public $actsAs = array('Containable');
 public $belongsTo = array('Reservation');

ここで、日付が 19 日以降の予約を検索します。日付は、reservation_details テーブルに格納されます。

$reservations = $this->Reservation->find('all', array(
                                        'conditions' => array(
                                            'Reservation.guest_id' => '1'
                                        ),
                                        'contain' => array(
                                              'ReservationDetail' => array(
                                                 'conditions' => array(
                                                     'ReservationDetail.date >=' => '2014-19-04'
                                                )
                                            )
                                        )

                                   ));

この検索で​​は、予約 #1 が返されます。これは、予約 #1 の ReservationDetail の空の配列です。問題は、私がその情報を一切欲しくないということです。ReservationDetail 条件が検索に一致する場合にのみ、データが返されるようにします。現時点では、一致が見つからない場合にのみ、ReservationDetail に空の配列を返します。

上記の検索の結果は次のようになります

Array(
    [0] => array   //I don't want this index to be returned at all because the reservation_details weren't met

    (
         [Reservation] => array
             (
                  id => 1
                  confirmation_number => 123
                  guest_id => 1
             )
         [ReservationDetail] => array
             (
             )

     )

     [1] => array

     (
         [Reservation] => array
             (
                  id => 2
                  confirmation_number => 345
                  guest_id => 2
             )
         [ReservationDetail] => array
             (
                  id => 5
                  reservation_id => 2
                  date => 2014-19-04
                  time => 13:00
                  room_id => 2
                  rate => 4.99 
             )
      )
)

ご覧のとおり、最初に見つかった結果の ReservationDetail は私の基準を満たしていませんでした。Reservation テーブルと ReservationDetail の空の配列を返します。

ReservationDetail が私の基準と一致しない場合、予約テーブルがまったく返されないように検索できる他の方法はありますか?

4

1 に答える 1

1
$reservations = $this->Reservation->find('all', array(
    'conditions' => array(
        'Reservation.guest_id' => 1,
        'ReservationDetail.date >=' => '2014-19-04'
    ),
    'joins' => array(
        array(
            'table' => 'reservation_details',
            'alias' => 'ReservationDetail',
            'type' => 'inner',
            'conditions' => array(
                'ReservationDetail.reservation_id = Reservation.id'
            )
        )
    ),
    'contain' => array(
        'ReservationDetail'
    )
));
于 2014-04-20T19:08:39.363 に答える