Страница 1 из 1

CActiveRecord фильтрация данных после запроса

Добавлено: 2015.07.24, 11:28
Kilimangaro
Привет! Ребята, есть вопрос такого характера. Имею таблицу posts в базе данных с полем lang которое определяет язык записи. Кроме того, это поле может принимать значение " * " (звездочка), означающая что эта запись выводится по умолчанию. Таким образом у меня в CActiveRecord имеется defaultScope такого содержания

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

public function defaultScope() {
        return array(
            'condition' => "lang = :lang OR lang = '*'",
            'params' => array(':lang' => Yii::app()->language)
        );
    }
Получить записи либо текущего языка, либо записи по умолчанию. Этот код хорошо работает до тех пор, пока не появляются записи текущего языка, в этом случае, данный код вместо ожидаемых записей lang = "ru" вернет еще и записи lang = "*". Что в данном случае не нужно. Мне нужно сделать так, что бы мне возвращались записи лишь нужного языка, а записи вида * возвращались в том, случае, если нужного языка нет. Можно, конечно, сделать за два запроса, что-то в духе

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

public function defaultScope() {
        return array(
            'condition' => "lang = :lang OR lang = '*'",
            'params' => array(':lang' => Yii::app()->language)
        );
    }
    public function lang($lang = '*'){
        $this->getDbCriteria()->mergeWith(array(
            'condition' => "lang = :lang",
                'params' => array(':lang' => $lang)
        ));
    }

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

if(!$posts = Post::model()->findAll()){
    $posts =  Post::model()->lang('*')->findAll();
}
Но использовать два запроса, как-то не правильно. Гораздо, правильнее, на мой взгляд, получать сразу записи текущего языка и записи по умолчанию и что бы модель уже работала с массивом, возвращая мне лишь необходимое. Что бы при запросе вида

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

$posts = Post::model()->findAll();
Я получил либо записи с текущим языком, если таковые есть, либо записи по умолчанию. Как бы вы реализовали такую задачу по изящнее?

Re: CActiveRecord фильтрация данных после запроса

Добавлено: 2015.07.24, 11:34
SiZE
1. Не использовать никогда defaultScope

2. Создать нужные scope и вызывать по необходимости

Re: CActiveRecord фильтрация данных после запроса

Добавлено: 2015.07.25, 12:59
Kilimangaro
1. Можно увидеть какие-то аргументы?
2. Это как-то решает проблему с которой я столкнулся?