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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Kven
Сообщения: 107
Зарегистрирован: 2016.10.20, 23:03

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

Сообщение Kven » 2019.04.26, 14:56

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

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

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

Usick
Сообщения: 26
Зарегистрирован: 2017.04.11, 12:07

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

Сообщение Usick » 2019.04.26, 16:11

Здесь можно посмотреть Фильтрация данных

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

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

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

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

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

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

Usick
Сообщения: 26
Зарегистрирован: 2017.04.11, 12:07

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

Сообщение Usick » 2019.04.26, 17:07

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

Аватара пользователя
Dominus
Сообщения: 799
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus » 2019.04.26, 20:40

Запрос будет получен без 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;
 }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!

Ответить