@jekahm

Принцип работы фильтрации данных в Yii2?

Доброго времени суток!
В оф. документации фреймворка Yii2 есть статья Data Widgets, в одной из секций которой описывается, как работает фильтрация данных. А так же приводится в качестве примера след. код модели PostSearch:

<?php

namespace app\models;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;

class PostSearch extends Post
{
    public function rules()
    {
        // only fields in rules() are searchable
        return [
            [['id'], 'integer'],
            [['title', 'creation_date'], 'safe'],
        ];
    }

    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

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

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

        // load the search form data and validate
        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }

        // adjust the query by adding the filters
        $query->andFilterWhere(['id' => $this->id]);
        $query->andFilterWhere(['like', 'title', $this->title])
              ->andFilterWhere(['like', 'creation_date', $this->creation_date]);

        return $dataProvider;
    }
}


Но я не могу понять, каким именно образом в переменную $dataProvider попадают дополнительные настройки фильтрации ($query->andFilterWhere...), если $query до этого уже была передана в параметрах ActiveDataProvider и значение её на тот момент было равным Post::find()?
Заранее благодарен!
  • Вопрос задан
  • 1845 просмотров
Пригласить эксперта
Ответы на вопрос 2
latteo
@latteo
$query - это объект, он передаётся по ссылке
$query->andFilterWhere - меняет его свойства
А запрос к базе происходит по вызову одного из методов $dataProvider: getModels(), getTotalCount(), etc

Вот например в случае GridView https://github.com/yiisoft/yii2/blob/2.0.8/framewo...
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Вы нажимаете кнопку фильтрации, формируется запрос, который влияет на результат. А именно тут:
if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }

обратите так же внимание, что это Search модель которая унаследована от обычной
Ответ написан
Ваш ответ на вопрос

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

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