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

How to get rid of null associated model in 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'
                )
            )
        )
    )
)

这无法使用 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'
                )
            ),
        )
    ));

您必须检查 table 名称是否正确以及外键名称是否正确。

另一种解决方案是检查您的结果,并取消设置空的结果

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