ORM и Модели

Что такое ORM и какие ограничения накладывает ее использование.

ORM — объектно-реляционное отображение.

http://ru.wikipedia.org/wiki/ORM

http://en.wikipedia.org/wiki/Object-relational_mapping

ORM  ответственно за хранение данных, описывает их структуру, валидирует для вставки и обновления.

Мы постарались максимально снизить ограничения, которые обычно накладывает ORM, осталось только два:

  • запись данных должна происходить через объекты ORM (иначе могут возникнуть проблемы целостности данных);
  • для извлечения связей “один ко многим” необходимо сверяться с таблицей связей.

ORM не содержит инструментария выборки списков объектов и цепочек взаимосвязей.

За выборку данных отвечают модели, которые содержат логику выборок данных.

Модели инстанцируются методом Model::factory('objectname') и бывают двух видов:

  • виртуальные — если Вы не определяли дополнительной логики модели, фабрика моделей вернет Вам ссылку на объект, содержащий набор стандартных методов выборки данных;
  • расширенные (реальные) — используются в том случае, если Вам необходимо расширить логику выборок.

Расширенные модели создаются просто — в папку models добавляется класс Model_Objectname, отнаследованный от Model, в нем Вы описываете дополнительную логику работы с данными объектов, например, дополнительные методы по выборке данных с определенными параметрами и условиями (Factory автоматически подхватит этот класс и вернет Вам ссылку на его объект).

При реализации расширенных моделей необходимо помнить, что при работе моделей используется позднее статическое связывание, будьте аккуратнее со статическими методами.

Также необходимо помнить, что для корректной работы с объектами необходимо их контроллеры и модели называть одинаково, например:

  • объект:  news;
  • модель:  Model_News;
  • контроллер административной части: Backend_News_Controller.

Внутри своих моделей Вы можете использовать даже прямые SQL-запросы на выборку данных. При этом желательно использовать Zend_Select и Zend_Db, ссылка на подключение к базе данных доступна по запросу $this->_db и содержит объект Zend_Db_Adapter. Метод $this->table() возвращает полное имя таблицы базы данных, в которой хранятся данные объекта.

Внутри модели также доступна ссылка на кэш данных $this->_dataCache, которая содержит либо false (если кэш отключен), либо ссылку на драйвер, реализующий Cache_Interface.

В ORM есть стандартные поля, и есть ссылки:

  • на объекты  (один к одному) - в качестве данных принимают id-идентификатор объекта;
  • на списки объектов (один ко многим) - в качестве данных принимают массив id-идентификаторов объекта;
  • ссылки на словари - в качестве данных принимают ключ словаря.

Особенность нашего ORM в том, что для выборки используются модели. То есть, нет необходимости цеплять за раз всю иерархию, с помощью моделей извлекаются только необходимые данные.

Начиная с версии  0.8.7 DVelum,  для модели может быть индивидуально переопределено подключение к базе данных, что позволяет рассредоточить данные по нескольким серверам баз данных, при этом они не обязательно должны быть MySql.

Обратите внимание, что при изменении структуры объектов перевалидация существующих данных не производится, это может привести к неблагоприятным последствиям.

Также необходимо учитывать, что текущая версия ORM  работает в  light + permissive  режиме, это означает, что при удалении объекта не производится проверка на наличие ссылающихся на него сущностей, в интерфейсе отображается статус -  связанный объект удален. Есть возможность активировать использование внешних ключей (основной файл конфигурации).

Поскольку DVelum - это в первую очередь среда разработки, Вы можете действовать, как считаете нужным, мы лишь стараемся упростить работу. Специально спроектировали ORM так, чтобы было как можно меньше проблем с прямыми выборками.