2017-01-24 2 views
0

Order.Item.ItemType.show_type = 1 항목 유형을 얻으려고합니다. 쿼리를 작성했지만 ItemType.show_type = 1이 모든 항목이 아님을 나타내는 Items 만 표시하려고합니다.cakephp 2.x에서 null 관련 모델을 제거하는 방법

$brief = $this->Order->find('first', array(
      'fields' => array(
       'Order.*' 
      ), 
      'conditions' => array(
       'Order.order_id' => $orderId, 
      ), 
      'contain' => array(     
       'Item' => array(
        'fields' => array(
         'Item.*', 'CHAR(64 + Item.num) AS letter' 
        ), 
        'conditions' => array(
         'Item.deleted' => 0, 
        ), 
        'ItemType' => array(
         'conditions' => array(
          'ItemType.show_type' => 1 
         ), 
        ) 
       ), 
      ) 
     )); 
쿼리는 항목 ID를 보여주지해야

= 25741

협회 :

// Order 
public $hasMany = array(
    'BriefInstalment' => array(
     'foreignKey' => 'order_id' 
    ) 
); 

// Item Model 
public $belongsTo = array(
    'Order', 
    'ItemType' => array(
     'type' => 'inner' 
    ) 
); 

// ItemType Model 
public $hasMany = array('Item'); 

인쇄 :

array(
    'Order' => array(
     'order_id' => '67817', 
     'service' => '', 
    ), 
    'Item' => array(
     (int) 0 => array(
      'id' => '25741', 
      'order_id' => '67817', 
      'num' => '2', 
      'item_type_id' => '8', 
      'name' => '3-5 titles active', 
      'deleted' => false, 
      'ItemType' => array(), // <= how to remove this empty model 
      'Item' => array(
       (int) 0 => array(
        'letter' => 'B' 
       ) 
      ) 
     ), 
     (int) 1 => array(
      'id' => '25742', 
      'order_id' => '67817', 
      'num' => '3', 
      'item_type_id' => '2', 
      'name' => '1,000 pro active', 
      'deleted' => false, 
      'ItemType' => array(
       'id' => '2', 
       'name' => 'Part Instalment', 
       'show_type' => true, 
       'deleted' => false 
      ), 
      'Item' => array(
       (int) 0 => array(
        'letter' => 'C' 
       ) 
      ) 
     ) 
    ) 
) 

답변

1

Countaible 동작을 사용하여 수행하지만, iwth 수 없습니다 joins 메서드는 재귀를으로 설정합니다.

$brief = $this->Order->find('first', array(
     'recursive' => -1, 
     'fields' => array(
      'Order.*' 
     ), 
     'conditions' => array(
      'Order.order_id' => $orderId, 
     ), 
     'joins' => array(     
      array(
       'table' => 'items', 
       'alias' => 'Item', 
       'type' => 'inner', 
       'conditions' => array(
        'Order.id = Item.order_id' 
       ) 
      ),    
      array(
       'table' => 'item_types', 
       'alias' => 'ItemType', 
       'type' => 'inner', 
       'conditions' => array(
        'ItemType.id = Item.item_type_id' 
       ) 
      ), 
     ) 
    )); 

테이블 이름이 올바른지 확인하고 외부 키 이름도 확인해야합니다.

또 다른 해결책이 결과를 통해 이동하는 것, 및 설정 해제 비어있는

foreach($brief as $k => $v){ 
    foreach($v['Item'] as $kk => $vv){ 
     if(empty($vv['ItemType'])){ 
      unset($brief[$k]['Item'][$kk]; 
     } 
    } 
} 
debug($brief); 
+0

감사합니다. 그러나 그것은 효과가 없습니다. – Fury

+0

모델을 공유 할 수 있습니까? –

+0

내 질문을 연관성으로 업데이트했습니다. – Fury