Страница 1 из 1

Как изменить запрос поисковой модели?

Добавлено: 2019.04.26, 14:56
Kven
Всем здравствуйте! Помогите пожалуйста, есть таблица materials с множеством различных полей, в таблице есть такое поле path куда записывается имя загружаемого документа. Я начал делать отдельную страницу по таблице materials, но только с выводом тех материалов, в которых есть загруженный документ. На странице я вывожу данные в таблицу GridView, проблема у меня в том, что сейчас выводятся совершенно все материалы без условия присутствия документа, но как написать такое условие я не понимаю. Единственное что я смог сделать это в функции search указать какие необходимы поля, а вот как и где (в контроллере или в модели) прописать условие вывода только материалов с path, которое не равно null.

Код: Выделить всё

public function search($params)
{
   $query = Materials::find();
   $query->select(['doctype_id' ,'name', 'path']);
...

Re: Как изменить запрос поисковой модели?

Добавлено: 2019.04.26, 16:11
Usick
Здесь можно посмотреть Фильтрация данных

Ну а если в двух словах: добавить 'path' в метод rules() search модели.

Условие вывода можно прописать в методе search(), если search модель используется только для этой страницы (иначе это условие будет применено ко всем остальным страницам где эта модель используется)

Код: Выделить всё

$query->andFilterWhere([...])
или в контроллере

Код: Выделить всё

$dataProvider->query->andWhere([...])

Re: Как изменить запрос поисковой модели?

Добавлено: 2019.04.26, 17:07
Usick
Хотя в rules() не надо добавлять path, он от пользователя не приходит и вместо метода andFilterWhere() использовать where() или andWhere()

Re: Как изменить запрос поисковой модели?

Добавлено: 2019.04.26, 20:40
Dominus
Запрос будет получен без path = null

Код: Выделить всё

public function search($params)
{
   $query = Materials::find();
   $query->select(['doctype_id' ,'name', 'path']);
   //...   
   $query->andWhere(['is not', 'path', null]);
   //...
Но если надо только отфильтровать, то

Код: Выделить всё

public function search($params)
{
   $query = Materials::find();
   $query->select(['doctype_id' ,'name', 'path']);
   //...
   
   $dataProvider = new ActiveDataProvider([
       'query' => $query,
       //...
   ]);

   $this->load($params);

   if (!$this->validate()) {       
       return $dataProvider;
   }
   
   $query->andFilterWhere(['is not', 'path', null]);
   //...
   
   return $dataProvider;
 }