В Yii2 удобно искать в GridView на основе SearchModel и метода search. Однако бывает так, что нужно сделать "расширенный поиск", который будет довольно сложным, содержать "отсылки" на другие модели (таблицы), множество отдельных блоков, в которых поиск осуществляется по связанным таблицам (может даже через одну или две), но которые связаны с текущей сущностью.
Как правильно поступать в данном случае и что делать? Делать ещё один метод advanced-search и строить логику для расширенного поиска там? а не смешивать её в search? А использовать какую-то кастомную форму, унаследованную от Model? А как оперировать и обычным поиском и расширенным в одном методе контроллера (например indexAction который, как правило, рендерит таблицу с данными сущности)?
Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
-
- Сообщения: 101
- Зарегистрирован: 2015.08.24, 18:50
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
Желательно сделать расшиоенную SearchForm extends Model со всеми нужными полями и методом search. И её через ActiveForm рендерить отдельно выше таблицы и её же использовать для расширенного поиска и обычного.
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
А можно сделать своеобразную панель с фильтрами. Добавить внутри search условий при заполненности поля из панели фильтров. Чтобы можно было использовать фильтры грида и панели фильтров.
-
- Сообщения: 101
- Зарегистрирован: 2015.08.24, 18:50
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
И для обычного тоже? Но ведь они могут различаться кардинально. Для простого поиска будет, допустим, 20 колонок и просто поиск среди 20 колонок в БД. А расширенный содержать лишь поиск по 4 колонкам из текущей сущности, а остальное вообще полностью всё из связанных различных таблиц с может быть какой-нибудь своеобразной логикой. К тому же, к примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.
Всё же один метод на всё стоит делать? Или разные методы как-то (не знаю как) использовать? Причём один может учитывать результаты фильтрации другого))
-
- Сообщения: 101
- Зарегистрирован: 2015.08.24, 18:50
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
По сути, расширенный поиск, и есть что-то доп. панели с фильтрами. Во всяком чисто визуально так и получается.
А если поиски могут несколько отличаться: К примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.
На все виды поиска всё же делать один метод, немного допиленный под те или иные возможности (к примеру простого поиска с точными совпадениями и расширенный, но без точного) ? Или разные методы как-то (не знаю как) использовать? Причём один может учитывать результаты фильтрации другого))
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
Расширенный поиск должен дополнять, но никак не противоречить поиску в гриде. При разногласиях просто напросто результат не выйдет пользователю.
-
- Сообщения: 101
- Зарегистрирован: 2015.08.24, 18:50
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
Ну не то, чтобы противоречить. Например в гриде может быть нестрогий поиск по имени пользователя например и строгий (за счёт применения знака "=" в начале). А в расширенном - надо найти пользователей, у которых настройки данных такие-то, например, находятся в каком-то регионе и стране, которые за последний месяц работали с документами и делали отчёты по ним. Условия совершенно разные, но выводятся всё еще пользователи по условию)) Но при этом конечно ещё и по имени в гриде фильтруется
Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?
Ничему не противоречит. Каждое условие дополняет поиск по своему if-у:i-programmer писал(а): ↑2020.05.28, 10:13 Условия совершенно разные, но выводятся всё еще пользователи по условию)) Но при этом конечно ещё и по имени в гриде фильтруется
Код: Выделить всё
$query->andFilterWhere(['like', 't.name', $this->name]);
if (!empty($this->region)) {
$query->joinWith('region region')->andWhere(['like', 'region.name', $this->region]);
}
Заполнят ещё и поле региона в расширенном - будет искать по имени и региону.
Можно сделать два поля вроде $name и $advancedName.i-programmer писал(а): ↑2020.05.28, 08:12 К примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.