2013-03-23 5 views
0

나는 다음과 같은 테이블이 있습니다CakePHP의 SQL 쿼리

- restaurant2 
    - menu1 
    - menu4 
- restaurant5 
    -menu3 
- restaurant19 
    - menu34 
    - menu33 

나의 첫번째 :

- restaurants (restaurant.id, restaurant.name) 
- menus (menu.id, menu.name, menu.active, menu.restaurant_id) 

내가 활성 메뉴가있는 모든 레스토랑 (menu.active = TRUE)와 목록을 갖고 싶어를 아이디어는 다음과 같았습니다.

$options['contain'] = array(
    'Menu' => array(
     'conditions' => $menuParams //array('Menu.active' => '1') //$menuParams 
     ) 
    ); 

모든 레스토랑이 표시되기 때문에 제대로 작동하지 않습니다. 나는 활동적인 메뉴가있는 레스토랑 만 갖고 싶습니다.

다음 생각 : 내가 원하는 정렬 된 목록이 없습니다 때문에,

$options['joins'] = array(
     array('table' => 'menus', 
      'alias' => 'Menu', 
      'type' => 'RIGHT', 
      'conditions' => array(
       'Menu.restaurant_id = Restaurant.id', 
      ) 
     ) 
    ); 

좋지 않아 조인을 사용. 식당 옆에있는 메뉴가 필요합니다. 위를보세요.

레스토랑 및 메뉴 (활성 = true)와 조인을 한 다음 포함을 사용하여 순서가 지정된 목록을 얻는 것이 올바른 방법입니까? 나는 그것이 작동 할 수 있다고 생각하지만 더 쉬운 방법이 있다고 생각한다. 그렇지?

도움이되었습니다. 고맙습니다.

+0

당신이 보여준'JOIN' 쿼리에''Menu.active '=>'1''을 추가해야합니다. 그러면 활성 메뉴가있는 레스토랑의 목록을 얻을 수 있습니다. 결과? –

+0

예, 맞습니다. 알고 있습니다. 좋아, 그룹은 잘못된 단어이다. 나는 아래의 첫 번째 목록과 같은 메뉴가있는 식당을 보여주고 싶다. , 레스토랑 1, 메뉴 1, 메뉴 2 레스토랑 2 menu49 : 레스토랑 1 레스토랑 1 메뉴 1, 레스토랑 2, menu49 레스토랑 2, menu22 내가 갖고 싶어 을 메뉴 2 : 지금 나는 다음과 같은 수 menu 22 – FishWave

+0

당신은'Restaurant.id'에'ORDER BY' 절이 필요합니다. – didierc

답변

0

CakePHP에서 ORM 기계를 사용하는 경우 레스토랑 모델과 각 테이블을 설명하는 메뉴 모델이 있어야합니다. 레스토랑 모델에서는 $hasMany = "Menu" 필드가 있고 메뉴에는 $belongsTo = "Restaurant" 필드 (모델 이름이 MenuRestaurant이라고 가정)가 있어야합니다.

$this->Restaurant->recursive = 1; // grab the menus 
$conditions = array('Menu.active' => '1'); // restrict to active menus only 
$this->Restaurant->find('all', array('conditions' => $conditions)); 

Restaurant 객체 배열의 행을 검색한다 Restaurant 컨트롤러의 애드혹에있어서의 위의 각각에 번들 : ORM을 사용하여 질의를 수행하는 시점에서

은 매우 간단 활성 배열 Menu.

+0

어떻게 작동합니까? – didierc

+0

고맙습니다. 나는 cakephp의 개념을 이해하고 있으며 $ belogsTo와 $ hasMany (나는 코드를 구웠다.)를 가지고있다. 당신의 해결책은 좋았고 나는 이것을 첫눈에 알게되었습니다. 발견되지 칼럼 : :하지만 내가 그 수준에 조건 Menu.active을 할 수없는 것 ... 시스템은 말한다 '절은 어디'지금 내 솔루션이하는 것입니다 – FishWave

+0

A [가입]에서 1054 알 수없는 열 'Menu.active'와 다음 [포함]. 조금 복잡하지만 작동합니다. – FishWave

0

이제 내 관심사에 대해 쉽고 깨끗한 해결책을 찾았습니다! 네!

먼저 바인딩을 바인딩 해제해야했고 그런 다음 조건을 가진 새로운 바인딩을 만들어야했습니다. 그것은 매력처럼 작동합니다. 다음은 코드입니다.

 $this->unbindModel(array('hasMany' => array('Menu'))); 
     $this->bindModel(array('hasMany'=>array(
      'Menu'=>array(
       'foreignKey' => 'restaurant_id', 
       'conditions' => array(
            'Menu.active' => 1 
            ) 
      ) 
     ))); 

답장을 보내 주셔서 감사합니다.