Я хочу использовать эту форму CakePHP для соединения LEFT. См. CakePHP Book - раздел о подключении таблиц
$options['joins'] = array(
array('table' => 'channels',
'alias' => 'Channel',
'type' => 'LEFT',
'conditions' => array(
'Channel.id = Item.channel_id',
)
)
);
$Item->find('all', $options);
ЗА ИСКЛЮЧЕНИЕМ, что мой LEFT JOIN имеет зависимую таблицу с условиями. В MySQL соединение выглядит так:
LEFT JOIN (
channels as Channel
INNER JOIN regions as Region ON ( Region.id = Channel.region_id and Region.id=1 )
) ON Channel.id = Item.channel_id
Могу ли я сделать то же самое в CakePHP 2.0 с помощью синтаксиса $options['joins']
?
Итак, после немного возиться, я обнаружил, что это "трюк" в CakePHP. Согласно SQL EXPLAIN, это гораздо более быстрое соединение, чем использование подзапроса для принудительных условий в таблице LEFT join
$options['joins'] = array(
array('table' => '(channels as `Channel` INNER JOIN regions as `Region`
ON ( `Region`.id = `Channel`.region_id and `Region`.id=1 ))',
// 'alias' => 'Channel', // the alias is 'included' in the 'table' field
'type' => 'LEFT',
'conditions' => array(
'Channel.id = Item.channel_id',
)
)
);
$Item->find('all', $options);
Немного поздно, но для тех, кто увидит это через Google, как и я, вы должны попробовать следующее.
$options['joins'] = array(
array(
'table' => 'channels',
'alias' => 'Channel',
'type' => 'LEFT',
'conditions' => array(
'Item.channel_id = Channel.id'
)
),
array(
'table' => 'regions',
'alias' => 'Region',
'type' => 'INNER',
'conditions' => array(
'Channel.region_id = Region.id',
'Region.id = 1'
)
)
);
$options['joins'] = array(
array('table' => 'channels',
'alias' => 'Channel',
'type' => 'LEFT',
'conditions' => array(
'Channel.id = Item.channel_id',
'Region.id' = 1
)
)
);
$Item->find('all', $options);
Ключ состояния в параметрах объединения может работать также