Все просто вы создаете в модели метод для поиска который должен отдать \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