dimas199862
@dimas199862
frontend и backend

Как настроить фильтр в yii2?

Привет, друзья. Попался проект написанный на yii2 программистом, который не оставил в коде ни одного комментария. Плюс ко всему я еще никогда не работал с проектами на yii2.
Перейду ближе к делу. Задание такое: нужно сделать (точнее доделать) фильтр по названию, которые соответственно прописаны в таблице базы данных Mysql. Я нашел скрипт фильтра:
...
            ->andFilterWhere(['like', 'documents.contract_number', $this->contractNumber])
            ->andFilterWhere(['like', 'companies.request_number', $this->requestNumber])
            ->andFilterWhere(['program.type' => $this->service])
            ->andFilterWhere(['manager_id' => $this->manager_id])
            ->andFilterWhere(['work_status' => $this->work_status])
            ->andFilterWhere(['companies.came_from' => $this->cameFrom])
            ->andFilterWhere(['inn' => $this->inn])
...

и соответственно, по аналогии, опираясь на структуру базы данных добавил такое условие:
->andFilterWhere(['like','program.name' , $this->mainProgram])

все бы хорошо, если бы не ошибка №42.
Структура бд точно такая, у меня подозрение на то, что где-то в коде есть грубо говоря массив с псевдонимами названий таблиц и полей базы данных. Может опытным yii'шникам это покажется смешным, но мне нужна помощь, очень долго уже вожусь с этим.

P.S: если в фильтре использую вместе program.name - program.id, то работает, но соответственно ищет по айди, а не по названию, подскажите куда копать?
  • Вопрос задан
  • 990 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Вам надо дописать немного поисковую модель.
Добавьте в эту модель публичное свойство. Это свойство потом будете выводить в gridView и по нему фильтровать.
Приблизительно так:
public $program_name_id; // необходимо добавить в правила rules(), например указать, что это свойство integer

public function rules()
{
   return [
        ['program_name_id', 'integer']
   ];
}

// и добавить в фильтры
->andFilterWhere(['program.id' => $this->program_name_id])

Теперь тут не совсем ясно, скорей всего "program" это связь между моделями и таблицами в базе.
Если это так, то в gridview можно вывести так:
'columns' => [
   [
     'attribute' => 'program_name_id',
     'value' => 'program.name'
   ]
]

И добавить фильтр
'columns' => [
   [
     'attribute' => 'program_name_id',
     'filter' => Program::getAllProgram()
     'value' => 'program.name'
   ]
]

Program::getAllProgram() в модели Program может выглядеть так
use yii\helper\ArrayHelper;
public static function getAllProgram()
{ 
    /**
   *  в запрос self::find()->all() можно добавить условие выборки, сортировки, группировки и т.д. и т.п.
   */
     return ArrayHelper::map(self::find->all(), 'id', 'name');
}


p.s. Что бы по имени искало, то думаю, что надо изменить в поисковой модели и в представлении так:
public $program_name; // необходимо добавить в правила rules(), например указать, что это свойство string

public function rules()
{
   return [
        ['program_name', 'string']
   ];
}

// и добавить в фильтры
->andFilterWhere(['like','program.name' , $this->program_name])

Если это так, то в gridview можно вывести так:
'columns' => [
   [
     'attribute' => 'program_name',
     'value' => 'program.name'
   ]
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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