@akula22

GridView и фильтр через hasOne?

В GridView вывожу поле user_id
[
                'attribute' => 'user_id',
                'options' => array('width'=>'200px'),
                'value' => function ($model) { return $model->destinationUser->username; },
  ]

то есть через hasOne получаю его имя по айди из таблицы User
public function getDestinationUser()
    {
        return $this->hasOne(\app\modules\user\models\User::className(), ['id' => 'user_id']);
    }


Как мне теперь фильтр использовать через имя?
Сейчас ошибка Значение «user_id» должно быть целым числом.
  • Вопрос задан
  • 420 просмотров
Решения вопроса 1
Допустим, что выводишь модель Foo, crud сгенерирован при помощи gii.
1. Добавляешь свойство $destinationUser в класс FooSearch:
class FooSearch extends Foo
{
    public $destinationUser;
 
    public function rules()
    {
        return [
           ...
            ['destinationUser', 'safe'],
           ...
        ];
    }

2. В методе FooSearch::search() добавляешь:
public function search($params)
{
    $query = Foo::find();

    $query->joinWith(['destinationUser']);
 
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);
 
    // Для сортировки по User->username
    $dataProvider->sort->attributes['destinationUser'] = [
        'asc' => ['user.username' => SORT_ASC],
        'desc' => ['user.username' => SORT_DESC],
    ];
...
    $query->andFilterWhere([
        ...
    ])
    // Для поиска по имени
    ->andFilterWhere(['like', 'user.username', $this->destinationUser]);
 
    return $dataProvider;
}


3. Поле выводить примерно так:
[
    'attribute' => 'destinationUser',
    'options' => ['width'=>'200px'],
    'value' => 'destinationUser.username',
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы