Это старая версия документа!


Инвентаризация: DEV: Search

Подсказки как делать поиск

Чтобы не ломать пагинацию 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]=$this->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;
    }
  • инвентаризация/dev/search.1747744897.txt.gz
  • Последнее изменение: 2025/05/20 12:41
  • admin