Чтобы правильно использовать критерии поиска, используйте классы и интерфейсы.
Скажем, например, вы определяете интерфейс ICriteria . Затем у вас есть разные подтипы (реализации) Критерии, TimeCriteria, DateCriteria, listCriteria, TextSearch Criteria, IntRange Criteria и т. Д.
То, что должен обеспечить ваш Criteria Interface, - это метод получения и установки для каждого критерия, вам придется обрабатывать 3 варианта использования для каждого критерия:
- как показать их
- как заполнить запрос результатами
- как сохранить их (в сеансе или в базе данных) для последующего использования
При показе критерия вам понадобится:
- a этикетка
- список доступных операторов (в, не в, =,>,> =, <, <=, содержит, не содержит) - и каждый подтип может решить, какая часть этого списка реализовано </li>
- an запись зона (список, ввод текста, ввод даты и т. Д.)
Ваш основной код будет обрабатывать только элементы ICriteria, предлагать им создавать себя, показывать их, давать им пользовательские входные данные, запрашивать их сохранение или циклически обрабатывать их для добавления критериев SQL в запрос SQL на основе их текущих значений.
Некоторые из реализаций Criteria будут наследовать другие, некоторым нужно будет только определить список доступных операторов, некоторые расширят простое поведение, чтобы добавить богатый пользовательский интерфейс (допустим, что некоторые элементы Date должны предоставлять список типа «в последний день», « за последнюю неделю ',' за последний год ',' пользовательский диапазон ').
Может быть очень хорошей идеей обрабатывать SQL-запрос как объект, а не только как строку, как, например, работает Zend_Db_Select. Поскольку каждый критерий будет добавлять свою часть в окончательный запрос, а некоторые из них могли бы добавлять leftJoins или сложные части запроса.