Когда какой класс Zend_Db использовать? Zend_Db_Select и Zend_Db_Table_Abstract

Я думаю, что можно писать запросы на выборку либо с Zend_Db_Select, либо с Zend_Db_Table_Abstract, но я не понимаю, когда какой из них использовать.

Является ли один более оптимизированным для чего-то, чем другой? Соединения «легче» с одним или другим?

Спасибо!


person Niels Bom    schedule 29.10.2010    source источник


Ответы (1)


По историческим причинам существует несколько различных вариантов создания запросов.

В ранних версиях Zend Framework у Zend_Db_Tables был метод fetchAll с параметрами, где порядок, смещение и ограничение, которые вы можете использовать для выборки строк из таблицы. Разработчики вскоре обнаружили ограничения в этом подходе. Как бы вы добавили предложение GROUP BY?

Zend_Db_Select был изобретен для решения этой проблемы, и вы заметите, что, начиная с ZF 1.5, fetchAll и связанные методы принимают экземпляр Zend_Db_Select в качестве первого параметра. Использование других параметров fetchAll теперь не рекомендуется, и вы должны передавать либо строку SQL, либо объект Zend_Db_Select.

Zend_Db_Select — это просто программный интерфейс для построения SQL-запроса. Это отлично подходит для изменения частей SQL на основе пользовательского ввода или различных факторов, поскольку вместо манипулирования строками вы можете просто изменить вызовы методов и аргументы.

Zend_Db_Table вернет экземпляр Zend_Db_Table_Select (подкласс Zend_Db_Select) с предопределенным именем таблицы, если вы вызовете его метод select — это единственное различие между Zend_Db_Select и Zend_Db_Table_Select.

На самом деле вам нужно решить, использовать ли Zend_Db_Select или писать SQL вручную. Zend_Db_Select не является бесконечно гибким, но с ним легко читать, манипулировать и работать с ним.

person David Snabel-Caunt    schedule 29.10.2010
comment
Отличный ответ! Я как бы подозревал, что за этой дублирующейся функциональностью стоит какая-то история :) - person Niels Bom; 29.10.2010
comment
Я думаю, что ZF2 предложит гораздо более чистую функциональность базы данных. Zend_Db_Table больше не особенно популярен, потому что он реализует Active Record, шаблон, от которого большинство отказалось в пользу Data Mappers. - person David Snabel-Caunt; 29.10.2010
comment
Active Record — это шаблон базы данных, используемый в Rails, верно? Я просмотрел его, и Rails 3 продолжит работу с ActiveRecord, что предполагает, что он еще не умер. У вас есть исходники для дампа Active Record? - person Niels Bom; 30.10.2010
comment
Извините, я должен был быть более ясным. В некоторых кругах PHP Active Record был заменен на Data Mappers, так как он обычно рассматривается как более продуманное и гибкое решение. Это верно для Doctrine 2 и Zend Framework 2 (хотя в ZF2, я думаю, будет рекомендовано использовать Doctrine или Propel). В Active Record объект связан со строкой и ее методом постоянства, а при отображении данных другой объект обрабатывает постоянство данных с помощью средств доступа. См. martinfowler.com/eaaCatalog/activeRecord.html и martinfowler.com/eaaCatalog/dataMapper.html - person David Snabel-Caunt; 30.10.2010