Дизайн шаблон вы ищете Query Object:
Объект, представляющий запрос к базе данных.
SQL может быть вовлеченным языком, и многие разработчики не особенно знакомы с ним. Кроме того, вам нужно знать, как выглядит схема базы данных для формирования запросов. Вы можете избежать этого, создав специализированные методы поиска, которые скрывают SQL внутри параметризованных методов, но это затрудняет формирование дополнительных запросов ad hoc. Это также приводит к дублированию в операторах SQL при изменении схемы базы данных.
Объект запроса - это interpreter [Gang of Four], то есть структура объектов, которые могут сформироваться в SQL-запрос. Вы можете создать этот запрос, обратившись к классам и полям, а не к таблицам и столбцам. Таким образом, те, кто пишет запросы, могут сделать это независимо от схемы базы данных, а изменения в схеме могут быть локализованы в одном месте.
Когда вы используете объект запроса, вообще не будет SQL для публичного API. Преобразование объекта запроса в соответствующий SQL-сервер поставщика будет происходить под капотом. Это будет связано с написанием соответствующих адаптеров и, не ограничиваясь этим, базами данных SQL.
альтернатива было бы использовать что-то вроде Zend_Db_Select
, который является внутренним DSL для создания запросов SQL.
Пример из ZF Reference Guide:
$select = $db->select()
->from(...specify table and columns...)
->where(...specify search criteria...)
->order(...specify sorting criteria...);
Но пока Zend_Db_Select
(и PDO упоминается в других местах) абстрактного доступа к используемой БД системы в какой-то степени, они все еще требуют, чтобы вы знали SQL и структуры таблиц. В отличие от объекта запроса, использование уровня абстракции DB, такого как , не гарантирует переносимость.
В зависимости от того, какие аргументы вы применяете в этих методах, вы можете получить запросы, которые больше не будут переносимыми, например. when you use a specific DB vendor's dialect or functions in the queries.
Так что выбрать, зависит от ваших запросов. Если вы знаете, что у вас есть только стандартные запросы, не используйте Query Object, потому что это гораздо больше усилий для реализации. Используйте объект запроса, если вы хотите получить максимальную независимость от источника данных.
Большое спасибо. это звучит действительно то, что я ищу. –