Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
nobodysfault
Сообщения: 5
Зарегистрирован: 2010.05.04, 19:32

Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение nobodysfault »

Эта же проблема уже описана кем-то в http://code.google.com/p/yii/issues/detail?id=1095, но он помечен, как invalid. Собственно, в чем проблема - есть модель с HAS_MANY или MANY_MANY отношением. Если в критерии поиска одновременно прописать и условие по какому-то из внешних полей, и лимит, то генерируются два запроса, первый из которых, без join, все равно содержит условие и вызывает, соответственно, ошибку. Вот минимальный кусок кода:

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

        $criteria=new CDbCriteria;
        $criteria->with = array('countries');
        $criteria->compare('countries.id','1');
        $criteria->limit = 2;
        $exclusives = Exclusive::model()->findAll($criteria);
 
И, соответственно, ошибка:

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

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'countries.id' in 'where clause' 
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение timlar »

А можно увидеть код самой реляции?
Twitter: @timlar_ua
nobodysfault
Сообщения: 5
Зарегистрирован: 2010.05.04, 19:32

Re: Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение nobodysfault »

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

    public function relations()
    {
        return array( 
                    'countries'=>array(self::MANY_MANY, 'Country', 'exclusive_country(exclusive_id, country_id)'),
        );
    } 
Установка 'together'=>true никак на ситуацию не влияет.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение timlar »

Можно так сделать:

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

'countries'=>array(self::MANY_MANY, 'Country', '', 'on'=>'countries.id=:id'), 
А в контроллере:

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

        $criteria=new CDbCriteria;
        $criteria->with = array('countries');
        $criteria->params = array(':id'=>'1');
        $criteria->limit = 2;
        $exclusives = Exclusive::model()->findAll($criteria); 
По идее должно сработать.
Twitter: @timlar_ua
nobodysfault
Сообщения: 5
Зарегистрирован: 2010.05.04, 19:32

Re: Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение nobodysfault »

Запрос получается с джойнами, вроде корректный, но параметр не биндится к нему:

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

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
Да и получается частный случай, а хотелось бы иметь возможность использовать compare(), чтобы не думать, задан ли параметр для условия или нет.
Werewolf
Сообщения: 98
Зарегистрирован: 2010.02.27, 14:37
Контактная информация:

Re: Условия и лимиты в HAS_MANY и MANY_MANY отношениях

Сообщение Werewolf »

Подтверждаю баг(фича) есть, правильно было бы проверять если есть группировка по первичному ключу первой таблицы, то не разбивать на два подзапроса.
Ответить