@akula22

Как отфильтровать данные под двум полям из другой таблицы?

в таблице matches два поля с айди юзера, user1 и user2
мне надо в гриде фильтровать по их имени из таблицы user

сделал две связи
public function getUserHome()
    {
        return $this->hasOne(User::className(), ['id' => 'user1']);
    }

    public function getUserAway()
    {
        return $this->hasOne(User::className(), ['id' => 'user2']);
    }

дальше в модели поиска
public function rules()
    {
        return [
            [['id', 'status'], 'integer'],
            [['user1', 'user2', 'created_at'], 'safe'],
        ];
    }
$query = Matches::find()->with(['userHome', 'userAway', 'profileHome', 'profileAway'])->where(['tour_id' => $this->tourId]);

// grid filtering conditions
        $query->andFilterWhere([
            'FROM_UNIXTIME(created_at, "%d.%m.%Y")' => $this->created_at,
            'status' => $this->status,
        ]);


        $query->joinWith(
            [
                'userHome' => function ($q) {
                    $q->where('user.username LIKE "%' . $this->user1 . '%"');
                },
//                'userAway' => function ($q) {
//                    $q->where('user.username LIKE "%' . $this->user2 . '%"');
//                }
            ]
        );


вот так работает, фильтруется юзер1, если раскоментить это
//                'userAway' => function ($q) {
//                    $q->where('user.username LIKE "%' . $this->user2 . '%"');
//                }

тогда ошибка
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'user'
The SQL being executed was: SELECT COUNT(*) FROM `matches` LEFT JOIN `user` ON `matches`.`user1` = `user`.`id` LEFT JOIN `user` ON `matches`.`user2` = `user`.`id` WHERE (`tour_id`='26') AND (user.username LIKE "%vla%") AND (user.username LIKE "%%")


подскажите как исправить?
  • Вопрос задан
  • 501 просмотр
Решения вопроса 1
@akula22 Автор вопроса
Чтение документации помогло )
надо было так
$query->joinWith(['userHome a' => function ($q) {
                    $q->where('a.username LIKE "%' . $this->user1 . '%"');
                }]);
        $query->joinWith(['userAway b' => function ($q) {
                $q->where('b.username LIKE "%' . $this->user2 . '%"');
            }]);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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