Фильтр по вычисляемому значению

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Фильтр по вычисляемому значению

Сообщение grig »

Доброго дня! Столкнулся с такой задачей: есть грид в который выглядит так:

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

GridView::widget([
    'dataProvider' => $oUsers,

    'columns' => [
         'username'
        'age',
        'unverifiedPhoto:boolean'
    ],
]); 
Значение для unverifiedPhoto берется из результата выполнения такого геттера:

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

public function getUnverifiedPhoto()
    {
        return $this->hasMany(Photo::className(), ['user_id' => 'id'])->andOnCondition(['is_public' => 0, 'is_private' => 0]);
    }
 
Работает это как и ожидается: в гриде колонке unverifiedPhoto ставится "Да" для новых фотографий и "Нет" для старых.
Тут встал вопрос: а как отфильтровать по этой штуке?
Есть отдельный фильтр и search модель. Только я что-то не могу представить как это должно отработать. Из филтра передаю в модель например значение чекбокса (1 или 0), в модели проверяю наличие значения так:

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

if (!empty($this->is_unverified_photo)){
           
        } 
В остальных случаях просто добавляется $query->andWhere(...), а вот что писать тут внутри скобок не понимаю... Помогите, пожалуйста.
Последний раз редактировалось grig 2015.03.12, 19:48, всего редактировалось 3 раза.
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: Фильтер по вычисляемому значению

Сообщение Alex@ »

все фильтра необходимо указывать в search.

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

if($this->user !== null) $query->andFilterWhere([User::tableName().'.id' =>$this->username]); 
у меня в фильтре грида выпадающий список пользователей группы.
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: Фильтер по вычисляемому значению

Сообщение grig »

Не совсем, то, что мне надо. Мне нужна фильтрация по результату вызова геттера (если я правильно понимаю). Если true - выводить в гриде одно, если false - другое. Только как сделать не понимаю.
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: Фильтер по вычисляемому значению

Сообщение grig »

Разобрался. Может кому пригодится:
Вписал joinWith:

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

if (!empty($this->is_unverified_photo)){
            $query->joinWith(['unverifiedPhoto' ]);
            $query->andWhere(['is_public' => 0, 'is_private' => 0]);
        }
И изменил метод в модели на:

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

 public function getUnverifiedPhoto()
    {
        return $this->hasMany(Photo::className(), ['user_id' => 'id']);
    }
 
Как оказалось все просто...
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: Фильтер по вычисляемому значению

Сообщение grig »

В одном месте решил проблему - так проблема вылезла в другом...
В гриде теперь при фильтрации по этому критерию перестает работать колонка 'unverifiedPhoto:boolean'
Заменил ее на

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

[
        'attribute'=>'unverifiedPhoto',
        'value'=>function($data){
            return  $data->id;
        }
        ] 
Чтобы посмотреть что передается в data. Так вот все дело в id. id берется из таблицы photo, а не user. Из-за этого видимо неправильно отрабатывает.
В модели пользователей сделал так:

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

//Чистый релейшен для фото
    public function getCleanPhoto()
    {
        return $this->hasMany(Photo::className(), ['user_id' => 'id']);
    }
    // Новые фото
    public function getUnverifiedPhoto()
    {
        return $this->getCleanPhoto()->andOnCondition(['is_public' => 0, 'is_private' => 0]);
    } 
getCleanPhoto нужно для фильтра, а getUnverifiedPhoto нужен для грида. Причем, если не применять фильтр, то все работает корректно. Как быть?
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Фильтер по вычисляемому значению

Сообщение Demon_id »

зачем плодить рилейшины? сделайте скоупами.
Ответить