Инструменты пользователя

Инструменты сайта


limb3_2007_4:ru:packages:active_record:doctrine

Limb3 ActiveRecord и Doctrine

FIXME Статья under-construction.

Первоначальная идея данного документа - показать удачные с нашей точки зрения моменты в ORM Doctrine, которые можно было бы реализовать в пакете ActiveRecord. Также будут отмечаться некоторые моменты, составляющие принципиальные отличия между Limb3 ActiveRecord и Doctrine.

Скажу сразу, что в целом Doctrine - очень хорошая ORM-библиотека, со многими возможностями. Однако каких-то принципиальных отличий от Limb3 ActiveRecord я не нашел. Ну может быть кроме DQL (язык объектных запросов, который позволяет реализовать eager fetching). То есть не нашел таких отличий, которые бы можно было интерпретировать однозначно как повод уже сейчас отказаться от Limb3 ActiveRecord и перейти на Doctrine как более мощный ORM. Хотя на этот счет у кого-то могут быть свои мнения…

Архитектура

Как ORM Doctrine использует свой DBAL. Интересная особенность - для выполнения всех операций она использует PDO, но для реализации дополнительного функционала используется дополнительная прослойка классов-драйверов. Эти классы отвечают за получения информации о структуре базы данных, Limit&Offset, операции импорта-экспорта. PDO используется таким образом только с целью изоляции от частных функции, например, mysql_select_db и прочих подобных.

Doctrine достаточно «тяжелая» библиотека и поэтому содержит средства для упаковки всех классов библиотеки в один php-файл, что позволяет ускорить работу приложения.

Классы модели

Doctrine описывает все поля таблиц в классах модели. Это предоставляет средства для генерации sql-кода по модели. В Doctrine есть средства для генерации классов модели по структуре базы данных. В модели описывается все, включая индексы и последовательности.

Doctrine поддерживает алиасы названий полей, например:

class Book extends Doctrine_Record {
    public function setTableDefinition(){
        $this->hasColumn('bookName as name', 'string');
    }
}

Doctrine поддерживает составные первичные ключи, а также любые поля, помимо id, в качестве первичных ключей.

Поддержка отношений

Doctrine поддерживает отношения one-to-many и one-to-one. Для реализации отношения many-to-many требуется дополнительный класс, а отношения описываются также как и 2 one-to-many.

Все отношения, которые в Limb3 описываются через belongs_to, many_belongs_to в Doctrine задаются только через hasOne и hasMany с дополнительным указанием, какие ограничения вступают в силу при удалении связанных объектов, и с указанием ключевых полей с обоих сторон. Этого они считают достаточным. Интересный подход, но с ходу иногда разобраться бывает трудновато - нехватает наглядности.

События

Doctrine содержит реализацию событий как на уровне модели, так и на уровне DBAL-а. На уровне модели, события в целом такие же как в Limb3. Реализация событий – более объектная. Если в Limb в качестве параметра в слушатель приходит сам объект ActiveRecord, то в Doctrine – это event-объект, у которого можно вызвать skipOperation()

DQL и raw sql с возможностью обворачивания результатов в объекты модели

DQL (Doctrine Query Language) -

Limb3 AR позволяет выполнять sql-запросы и обворачивать результат в объекты ActiveRecord. Doctrine в этом отношении впереди - она позволяет получать объекты нескольких классов:

$q = new Doctrine_RawSql();
$q->select('{u.*}, {p.*}')
  ->from('user u LEFT JOIN phonenumber p ON u.id = p.user_id')
  ->addComponent('u', 'User u')
  ->addComponent('p', 'u.Phonenumber p');
 
$users = $q->execute();
$user[0]; // User object

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ____     __   __  ___   __ __   ____
  /  _/ __ / /  /  |/  /  / //_/  / __/
 _/ /  / // /  / /|_/ /  / ,<    / _/  
/___/  \___/  /_/  /_/  /_/|_|  /_/
 
limb3_2007_4/ru/packages/active_record/doctrine.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)