Реляционный запрос и scope

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
smff
Сообщения: 1
Зарегистрирован: 2013.01.18, 11:40

Реляционный запрос и scope

Сообщение smff »

Странное поведение:
Модель Platform

Код: Выделить всё

public function relations()
    {
        return [
            'cas_p_g_h'    => [self::HAS_MANY, 'Cas_p_g_h', 'p_id']
        ];
    }

Код: Выделить всё

$platforms = Platform::model()->with(
    [
        'cas_p_g_h' =>    [
            'condition' => 'h_id=1'
        ]
    ]
)->findAll();
Генерирует такой запрос:
SELECT `t`.`p_id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`alias` AS `t0_c2` FROM `platform` `t` LEFT OUTER JOIN `cas_p_g_h` `cas_p_g_h` ON (`cas_p_g_h`.`p_id`=`t`.`p_id`) WHERE (h_id=1)

При:

Код: Выделить всё

$platforms = Platform::model()->with(
    [
        'cas_p_g_h' =>    [
            'scopes' => [
                'applyHost' => 1
            ]
        ]
    ]
)->findAll();
 
Модель Сas_p_g_h

Код: Выделить всё

public function applyHost($host)
    {
        $this->getDbCriteria()->mergeWith(array(
        'condition'=>'host=:host',
        'params'=>array(':host'=>$host),
        ));
        return $this;
    }
---
Генерирует такой запрос:
SELECT `t`.`p_id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`alias` AS `t0_c2` FROM `platform` `t` LEFT OUTER JOIN `cas_p_g_h` `cas_p_g_h` ON (`cas_p_g_h`.`p_id`=`t`.`p_id`) AND (h_id=1)

Ключевой момент в первом варианте WHERE во втором AND. Такое поведение портит всю малину.
Объясните, пожалуйста это баг или плохое чтение документации(использование scope)
Есть 2 таблицы. В одной названия платформ. В другой связь платформа-хост. Запрос выдает правильный результат только при использовании "condition" непосредственно в массиве параметров. При использовании scope — результат содержимое таблицы Platform.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Реляционный запрос и scope

Сообщение yiijeka »

чтобы было во втором случае where нужно applyHost перенести в Модель Platform

http://www.yiiframework.com/doc/guide/1 ... .ar#sec-11
http://www.yiiframework.com/doc/guide/1 ... arr#sec-10
Ответить