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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Kilimangaro
Сообщения: 27
Зарегистрирован: 2013.02.04, 19:17
Откуда: Украина, Днепропетровск

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

Сообщение 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();
Я получил либо записи с текущим языком, если таковые есть, либо записи по умолчанию. Как бы вы реализовали такую задачу по изящнее?
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

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

Сообщение SiZE »

1. Не использовать никогда defaultScope

2. Создать нужные scope и вызывать по необходимости
Аватара пользователя
Kilimangaro
Сообщения: 27
Зарегистрирован: 2013.02.04, 19:17
Откуда: Украина, Днепропетровск

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

Сообщение Kilimangaro »

1. Можно увидеть какие-то аргументы?
2. Это как-то решает проблему с которой я столкнулся?
Ответить