如何摆脱cakephp 2.x中的null关联模型

时间:2017-01-24 14:27:20

标签: cakephp cakephp-2.x

我正在尝试获取Order.Item.ItemType.show_type = 1的项目类型。我已经编写了查询但我只想显示Items他们的ItemType.show_type = 1并非所有项目。

$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 个答案:

答案 0 :(得分:1)

使用Countaible行为无法完成此操作,但如果使用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);