@EVOSandru6

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

Добрый день,

Сделал фильтр по связанной модели, руководствуясь данными статьями:
webdishes.ru/filter
https://nix-tips.ru/yii2-sortirovka-i-filtr-gridvi...

Дело в том, что у меня основная модель - Orders ссылается на модель Places 2-мя внешними ключами - place_from_id, place_to_id.

В примере следующиего кода отрабатывает фильтрация для placeFrom:

class OrdersSearch extends Orders
{

    public $placeFromName;
    public $placeToName;
...
public function rules()
    {
        return [
...
            [['placeFromName','placeToName'], 'safe']
   ....
  ];
}
....

public function search($params)
    {
        $query = Orders::find();

        $query->joinWith(['placeFrom']); // , 'placeTo

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $dataProvider->sort->attributes['placeFrom'] = [
            'asc' => ['t_places.name' => SORT_ASC],
            'desc' => ['t_places.name' => SORT_DESC],
        ];
        $dataProvider->sort->attributes['placeTo'] = [
            'asc' => ['t_places.name' => SORT_ASC],
            'desc' => ['t_places.name' => SORT_DESC],
        ];

        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }

       $query->andFilterWhere([
            'place_from_id' => $this->place_from_id,
            'place_to_id' => $this->place_to_id,
         ....
        ]);

        $query
            ->andFilterWhere(['like', 'LOWER(t_places.name)', strtolower($this->placeFromName)])
            ->andFilterWhere(['like', 'LOWER(t_places.name)', strtolower($this->placeToName)])
        ;
        return $dataProvider;
    }
...
}


Но мне то по 2-м полям надо искать, если я заменяю:

$query->joinWith(['placeFrom']); // , 'placeTo

на:

$query->joinWith(['placeFrom' , 'placeTo]);

Ловлю:
Database Exception – yii\db\Exception

SQLSTATE[42712]: Duplicate alias: 7 ERROR: table name "t_places" specified more than once
The SQL being executed was: SELECT COUNT(*) FROM "m_orders" LEFT JOIN "t_places" ON "m_orders"."place_from_id" = "t_places"."id" LEFT JOIN "t_places" ON "m_orders"."place_to_id" = "t_places"."id" WHERE (m_orders.exist != 2) AND ((("status_id" = 5) OR ("status_id" = 4)) OR ("driver_id"=9))
Error Info: Array
(
[0] => 42712
[1] => 7
[2] => ERROR: table name "t_places" specified more than once
)

Caused by: PDOException

SQLSTATE[42712]: Duplicate alias: 7 ERROR: table name "t_places" specified more than once


Я понимаю, что видимо неправильно джоинить 2 раза одну и туже таблицу.

Подскажите, как правильно поступить, чтобы фильтр проходил корректно по 2-м полям, ссылающимся на одну и ту же таблицу?
  • Вопрос задан
  • 738 просмотров
Решения вопроса 1
padlyuck
@padlyuck
$query->joinWith(['placeFrom placeFrom' , 'placeTo placeTo']);// добавили алиасы
$query
            ->andFilterWhere(['like', 'LOWER(placeFrom.name)', strtolower($this->placeFromName)])
            ->andFilterWhere(['like', 'LOWER(placeTo.name)', strtolower($this->placeToName)])
        ;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы