Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение i-programmer »

В Yii2 удобно искать в GridView на основе SearchModel и метода search. Однако бывает так, что нужно сделать "расширенный поиск", который будет довольно сложным, содержать "отсылки" на другие модели (таблицы), множество отдельных блоков, в которых поиск осуществляется по связанным таблицам (может даже через одну или две), но которые связаны с текущей сущностью.

Как правильно поступать в данном случае и что делать? Делать ещё один метод advanced-search и строить логику для расширенного поиска там? а не смешивать её в search? А использовать какую-то кастомную форму, унаследованную от Model? А как оперировать и обычным поиском и расширенным в одном методе контроллера (например indexAction который, как правило, рендерит таблицу с данными сущности)?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение ElisDN »

Желательно сделать расшиоенную SearchForm extends Model со всеми нужными полями и методом search. И её через ActiveForm рендерить отдельно выше таблицы и её же использовать для расширенного поиска и обычного.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение unknownby »

А можно сделать своеобразную панель с фильтрами. Добавить внутри search условий при заполненности поля из панели фильтров. Чтобы можно было использовать фильтры грида и панели фильтров.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение i-programmer »

ElisDN писал(а): 2020.05.27, 23:41 Желательно сделать расшиоенную SearchForm extends Model со всеми нужными полями и методом search. И её через ActiveForm рендерить отдельно выше таблицы и её же использовать для расширенного поиска и обычного.
И для обычного тоже? Но ведь они могут различаться кардинально. Для простого поиска будет, допустим, 20 колонок и просто поиск среди 20 колонок в БД. А расширенный содержать лишь поиск по 4 колонкам из текущей сущности, а остальное вообще полностью всё из связанных различных таблиц с может быть какой-нибудь своеобразной логикой. К тому же, к примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.

Всё же один метод на всё стоит делать? Или разные методы как-то (не знаю как) использовать? Причём один может учитывать результаты фильтрации другого))
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение i-programmer »

unknownby писал(а): 2020.05.28, 07:57 А можно сделать своеобразную панель с фильтрами. Добавить внутри search условий при заполненности поля из панели фильтров. Чтобы можно было использовать фильтры грида и панели фильтров.
По сути, расширенный поиск, и есть что-то доп. панели с фильтрами. Во всяком чисто визуально так и получается.

А если поиски могут несколько отличаться: К примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.

На все виды поиска всё же делать один метод, немного допиленный под те или иные возможности (к примеру простого поиска с точными совпадениями и расширенный, но без точного) ? Или разные методы как-то (не знаю как) использовать? Причём один может учитывать результаты фильтрации другого))
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение unknownby »

Расширенный поиск должен дополнять, но никак не противоречить поиску в гриде. При разногласиях просто напросто результат не выйдет пользователю.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение i-programmer »

unknownby писал(а): 2020.05.28, 08:47 Расширенный поиск должен дополнять, но никак не противоречить поиску в гриде. При разногласиях просто напросто результат не выйдет пользователю.
Ну не то, чтобы противоречить. Например в гриде может быть нестрогий поиск по имени пользователя например и строгий (за счёт применения знака "=" в начале). А в расширенном - надо найти пользователей, у которых настройки данных такие-то, например, находятся в каком-то регионе и стране, которые за последний месяц работали с документами и делали отчёты по ним. Условия совершенно разные, но выводятся всё еще пользователи по условию)) Но при этом конечно ещё и по имени в гриде фильтруется
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Где и как правильно делать расширенный поиск, с множеством зависимых таблиц?

Сообщение ElisDN »

i-programmer писал(а): 2020.05.28, 10:13 Условия совершенно разные, но выводятся всё еще пользователи по условию)) Но при этом конечно ещё и по имени в гриде фильтруется
Ничему не противоречит. Каждое условие дополняет поиск по своему if-у:

Код: Выделить всё

$query->andFilterWhere(['like', 't.name', $this->name]);

if (!empty($this->region)) {
    $query->joinWith('region region')->andWhere(['like', 'region.name', $this->region]);
}
Заполнят только имя в простом поиске - отфильтрует только по имени.
Заполнят ещё и поле региона в расширенном - будет искать по имени и региону.
i-programmer писал(а): 2020.05.28, 08:12 К примеру в гриде может быть добавлена логика по, например, точному/неточному совпадению, где, допустим, пользователь написал "=" и тогда ищется точное совпадение. А в расширенном такого не будет.
Можно сделать два поля вроде $name и $advancedName.
Ответить