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

Есть таблица organizations со следующими столбцами:

id - id организации
short_name - краткое наименование организации
full_name - полное наименование организации
parent_organization - наименование родительской организации.

Поле parent_organization содержит в себе id организации из этой же таблицы.
В значении атрибута выводится краткое наименование родительской организации: 'value' => 'parentOrganization.short_name'.

В модели Organizations прописан геттер:

public function getParentOrganization()
{
    return $this->hasOne(Organizations::className(), ['id' => 'parent_organization']);
}


Необходимо настроить фильтр GridView таким образом, чтобы при поиске по полю parent_organization формировался корректный запрос к БД для сопоставления вводимого поискового запроса с содержимым поля short_name родительской организации.

В настоящий момент при написании составного запроса БД (PostgreSQL) ругается на то повторное обращение к одной и той же таблице.

Сам запрос к БД должен выглядеть следующим образом:

select * from organizations_schema.organizations where parent_organization = ( select id from organizations_schema.organizations where short_name like '%Поисковый_запрос%' );


Заранее спасибо!
  • Вопрос задан
  • 419 просмотров
Решения вопроса 1
@myphpscript
class OrganizationsSearch extends Organizations
{

    public $parent_short_name;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['parent_short_name'], 'string'],

            // other rules
        ];
    }


    public function search($params)
    {
        $query = Organizations::find();
        $query->alias('org');

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

        $query->joinWith(['parentOrganization' => function($q) {
            /**
             * @var ActiveQuery $q
             */

            $q->alias('par_org');
        }]);

        $this->load($params);

        $dataProvider->setSort([
            'attributes' => [
                'parent_short_name' => [
                    'asc' => ['par_org.short_name' => SORT_ASC],
                    'desc' => ['par_org.short_name' => SORT_DESC],
                ],

                // other attributes
            ],
            'defaultOrder' => [
                // defaultOrders
            ],
        ]);

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

        $query->andFilterWhere(['ilike', 'org.short_name', $this->short_name]);
        $query->andFilterWhere(['ilike', 'par_org.short_name', $this->parent_short_name]);

        return $dataProvider;
    }
}


в GridView:
'attribute' => 'parent_short_name',
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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