2014-04-20 6 views
1

저는 Cake 2.3.8을 사용하고 있고 데이터를 효율적으로 검색하는 데 어려움을 겪고 있습니다. 내가 찾고있는 데이터를 가져오고 있지만 containables 때문에 필요하지 않은 것들도 많이 있습니다. 예를 들어CakePHP containable searches

나는 다음과 같은 모델

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

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

이제 날짜가 19보다 크거나 같다 예약에 대한 검색을 수행와

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_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에 대해 ReservationDetail의 빈 배열 인 Reservation # 1을 반환합니다. 문제는 그 어떤 정보도 원하지 않는다는 것입니다. 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. ReservationDetail에 대해서는 여전히 Reservation 테이블과 빈 배열을 반환합니다.

ReservationDetail이 내 기준과 일치하지 않는 경우 예약 테이블이 전혀 반환되지 않도록 검색 할 수있는 다른 방법이 있습니까?

+0

이 경우 데이터베이스 정규화 프로세스에 대해 다시 생각해 봐야합니다. –

+0

@FazalRasel thats 내가해야 할 일이 무엇인지 알았습니다. 테이블 구조에 대한 제안이 있습니까? 날짜별로 정렬하는 것이 내가 가진 유일한 문제입니다. 준비된 진술서는 괜찮을까요? – user3476345

+0

글쎄, 아직도 할 수있어 ... 테이블에 합류하기 만하면 돼 ... –

답변

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' 
    ) 
)); 
+0

감사합니다. 완벽하게 작동했습니다. – user3476345