usdglander
@usdglander
Yipee-ki-yay

Есть ли хорошая дока по работе с GridView Yii2?

Добрый день.
Разбираюсь с gridview. Хочется узнать побольше (и по понятнее) про поиск по связанным таблицам. Никак не получается... :/
Посоветуйте доку или хорошие примеры как настраивать фильтры учитывая релейшены.
Заранее спасибо.
  • Вопрос задан
  • 640 просмотров
Решения вопроса 1
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Все просто вы создаете в модели метод для поиска который должен отдать \yii\data\ActiveDataProvider
Модель может быть та которая, связана с базой или может быть моделью формой.
Нам от модели для грида нужно только атрибуты и валидация? метод поиска, так как заполненные атрибуты мы используем в методе + GridView над Заголовком столбцом выводит инпут
/**
     * @param $params
     * @param $group
     * @return \yii\data\ActiveDataProvider
     */
    public function search($params, $group = null )
    {
        $this->scenario = self::SCENARIO_SEARCH;          // когда у вас много правил по умолчанию следует использовать сценарии
	
		// базовый поиск
        $query = self::find();
        $dataProvider = new \yii\data\ActiveDataProvider([
            'query' => $query,
        ]);

		
	// Тут и нужный кастомные сценарии если базовая валидация мешает.
        if (!( $this->load($params) && $this->validate())) {
            return $dataProvider;
        }
		
	// применяем сортировку
        $dataProvider->setSort([
            'attributes' => [
                'id',
            ]
        ]);

		// добавляем к поиску условие например найти по диапазону даты.
        if(!empty($this->dateFrom) && !empty($this->dateTo)) {
            $query->andWhere('`hour_at` BETWEEN :dateFrom AND :dateTo', [
                ':dateFrom' => date('Y-m-d H:00:00', strtotime(trim($this->dateFrom))),
                ':dateTo' => date('Y-m-d H:59:59', strtotime(trim($this->dateTo))),
            ]);
        }
		
	// Добавляет условия если атрибуты нашей модели заполнены !=null
        $query->andFilterWhere([
            'stream_id'       => $this->stream_id,
            'country_id'      => $this->country_id,
            'browser'         => $this->browser,
            'os'                  => $this->os,
        ]);
        return $dataProvider;
    }


<?=GridView::widget([
        'dataProvider'    => $user->search(Yii::$app->request->get()),
        'filterModel' => $user,
        'columns' => [
            'id',
            'username' => [
                'attribute' => 'username',
            ],
            'email',
]]);?>


Поиск с использованием Join теоретически добавляем условие к нашему activeQuery кусок Sql запроса.
$query->join('left',Country::tableName(),'user.country_id='.Country::tableName().'.id');
        $query->andFilterWhere([
            Country::tableName().'.name' => $this->countryName
        ]);

Где countryName public свойство класса модели + объявлено в rules например как string
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Здесь есть небольшое описание с примером и кодом.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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