Подсказки как делать поиск
Чтобы не ломать пагинацию Join'ами (а она ломается изза дополнительных строк, которые дает Join в случае one-to-many relation), нужно делать так:
public function search($params) { //Запрос для данных (БЕЗ JOIN чтобы не ломалась пагинация) $query = MaintenanceJobs::find() ->with([ 'schedule', 'comps', 'techs', 'services' ]); //запрос для фильтра (с JOIN чтобы нормально можно было фильтровать по связанным объектам) $filter=MaintenanceJobs::find() ->select('DISTINCT(maintenance_jobs.id)') ->joinWith([ 'schedule', 'comps', 'techs', 'services' ]); //сокращенно тоже самое //в $columns надо бы передать список выводимых в таблице атрибутов, чтобы джойнить только нужное [$query,$filter]=(new MaintenanceJobs())->prepareSearch($columns); $dataProvider = new ActiveDataProvider(['query' => $query,]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1'); return $dataProvider; } // наполняем фильтр всякими WHERE $filter->andFilterWhere([ 'schedules_id' => $this->schedules_id, ]); $filter->andFilterWhere(['like', 'name', $this->name]) ->andFilterWhere(['like', 'description', $this->description]) ->andFilterWhere(['like', 'links', $this->links]) ->andFilterWhere(QueryHelper::querySearchString(['AND/OR', 'IFNULL(comps.name,"")', 'IFNULL(techs.num,"")', 'IFNULL(techs.hostname,"")', 'IFNULL(services.name,"")' ], $this->objects)) ->andFilterWhere(QueryHelper::querySearchString(['AND/OR', 'IFNULL(schedules.name,"")', 'IFNULL(schedules.description,"")', ],$this->schedules_id)); //если фильтруем, то делаем двухходовку в виде SUB-QUERY if ($filter->where) { //фильтруем запрос данных по ID из фильтра, который мы только что получили при помощи разных WHERE $query->where('maintenance_jobs.id in ('.$filter->createCommand()->rawSql.')'); } return $dataProvider; }