Criteria for finder

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
mlapko
Сообщения: 37
Зарегистрирован: 2012.06.03, 21:57

Criteria for finder

Сообщение mlapko »

Собственно вот, есть код
Cкоуп:

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

    public function createdBy($userId)
    {
        $a = $this->getTableAlias(false, false);
        $criteria = $this->getDbCriteria();
        $criteria->addCondition($a . '.user_id = ' . (int)$userId);
        return $this;
    }
 

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

$criteria = new CDbCriteria();
$criteria->scopes['createdBy'] = array('userId' => 1);
$criteria->addCondition('id <> 0'); //tmp condition
$finder = Post::model(); //finder
$finder->setDbCriteria($criteria);
$posts = $finder->findAll();
 
В итоге формируется запрос SELECT * FROM `posts` `t` WHERE id <> 0
Вопрос почему не применяются скоупы?
Mike
Сообщения: 5
Зарегистрирован: 2013.09.04, 21:04

Re: Criteria for finder

Сообщение Mike »

Привет!
Возможно в методе createdBy() Вы возвращаете не критерию а саму модель ActiveRecord(), то есть нужно поставить return $criteria;
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

Re: Criteria for finder

Сообщение MaxHero »

Не понимаю, зачем Вы еще дополнительно наполняете критерию? Ведь используете finder, так используйте его по полной программе :) :

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

$finder = new Post();
$finder->createdBy(1);
$finder->getDbCriteria()->addCondition('id <> 0'); //tmp condition

$posts = $finder->findAll();
 
И еще, потенциальный баг:

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

$a = $this->getTableAlias(false, false); 
так стоит определять alias только в defaultScope, иначе рискуете получить конфликт alias при использовании scope'ов в relation'ах. Просто пишите

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

$a = $this->getTableAlias(); 
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Criteria for finder

Сообщение Ekstazi »

Попробуйту в findAll передавать критерий и сравнить результат. Если запросы разные будут, то похоже на баг.
Ответить