CakePHP LEFT JOIN для нескольких таблиц с условием

0

Я хочу использовать эту форму 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
left-join

3 ответа

1
Лучший ответ

Итак, после немного возиться, я обнаружил, что это "трюк" в 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);
1

Немного поздно, но для тех, кто увидит это через 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'
        )
    )
);
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);

Ключ состояния в параметрах объединения может работать также

  • 0
    нет, это не правильно. вам все еще нужно добавить таблицу регионов в объединение, и если вы добавляете ее отдельно, то вам нужно присвоить ей отдельный тип соединения LEFT / INNER. Вы получите другой результат. Вы можете добавить Region вместе с Channel в суб-выборе, но это гораздо более медленный запрос.
  • 0
    И содержать () с моделями ассоциаций?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню