CakePHP может содержать соединение без поиска дополнительной таблицы

Я пытаюсь соединить две таблицы и нашел этот пост о том, как это сделать с помощью контейнеров. .

Таблицы, к которым я пытаюсь присоединиться, — это заказы и order_items. Вот код в моем контроллере Order и Order_Item

Class OrderItem extends AppModel {
    public $useTable = 'order_items';
    public $actsAs = array('Containable');
    public $belongsTo = array('Order');
}

class Order extends AppModel {  
    public $actsAs = array('Containable');
    public $hasMany = array('OrderItem');
}

Вот запрос в OrdersController

$order_list = $this->Order->find('all', array(              
                                'contain' => array('OrderItem'),
                                'conditions' => array(
                                'Order.order_status' => 'filled',
                                'OrderItem.item_status' => 'filled'
                                )
                            ));

Прямо сейчас он не запрашивает таблицу order_items. Я получаю следующую ошибку

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Order_Item.item_status' in 'where clause'

После дальнейшего изучения запрос даже не ищет таблицу order_items, а только таблицу заказов. Я предполагаю, что это правда, потому что он не нашел столбец, который я указал в условиях.

Вот результирующий запрос

SQL Query: SELECT `Order`.`id`, `Order`.`userid`, `Order`.`order_status`, `Order`.`email`, 
`Order`.`total`, `Order`.`fullName`, `Order`.`address`, `Order`.`city`, `Order`.`state`, 
`Order`.`zip`, `Order`.`created`, `Order`.`modified` FROM `ordersdb`.`orders` AS `Order` 
 WHERE `Order`.`order_status` = 'filled' AND `OrderItem`.`item_status` = 'filled'

person user2443591    schedule 14.06.2013    source источник


Ответы (1)


Containable выполняет отдельный запрос для каждой модели, которую вы передаете ключу «Contain». В вашем случае поле item_status не существует в таблице заказов, поэтому у вас есть эта ошибка.

Я думаю, вам нужно сделать что-то вроде этого

 $order_list = $this->Order->find('all', array(              
                        'contain' => 'OrderItem.item_status == filled',                                                                 
                        'conditions' => array(
                        'Order.order_status' => 'filled'
                        )
                    ));

См. кулинарную книгу для получения дополнительной информации http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

person Rudy Lee    schedule 14.06.2013