2017-01-24 6 views
0

Я пытаюсь получить типы предметов, которые Order.Item.ItemType.show_type = 1. Я написал запрос, но хочу показать только Items, что их ItemType.show_type = 1 не все.Как избавиться от нулевой ассоциированной модели в cakephp 2.x

$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 
         ), 
        ) 
       ), 
      ) 
     )); 

Запрос не должен показывать Item 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'); 

Print:

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, установите рекурсивный на -1

$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

 Смежные вопросы

  • Нет связанных вопросов^_^