Doctrine. Структура. Entity

Сразу после начала работы с Doctrine обзавелся некоторыми предрассудками. Сам их сейчай искоренил, но, может у кого-то они еще есть, может заметка кому-то поможет =)

Помимо того, что писалось в этой заметке (что доктрина представляет собой абстрактный слой для работы с БД), сама доктрина предоставляет состоит из нескольких слоев для работы с БД:

DBAL->ORM(ODM)

Оба слои используют Common

ORM(ODM) включает DBAL.

Эти три пакеты входят в состав Доктрины.

Начнем с Common. Этот компонент не имеет прямого отношения к БД (из-за этого я не назвал его третьим слоем Доктрины), но тем не менее используется другими компонентами доктрины.

Состоит из трех частей:

  1. Class Loading
  2. Doctrine Annotations
  3. Doctrine Caching
Class Loading представляет собой автозагрузчик php классов (может выполнять те же функции, что и автозагрузчик композера)

Doctrine Annotations представляет собой мощное средство для... как бы это лучше сказать... интерпретации php док блоков в программный код.

Annotations первоначально использовались для ORM/ODM mapping, но достаточно универсальны. Используя компонент, вы можете создавать свои аннотации. В Symfony framework наиболее встречающееся использование аннотаций - ORM/ODM mapping и Validation Constraints (позволяет задавать параметры валидации).

Doctrine Caching - компонент для временного хранения (кэширования) данных. Достаточно простой в использовании и удобный. DBAL представляет собой базовою надстройку над PDO.

Из интересного предоставляет ООП средства для написания запросов.

И наконец-то плавно перешли к  ORM(ODM) и предрассудкам =).

ORM (Object-relational mapping) представляет данные из реляционной БД ООП виде.

ODM - то же самое для документных БД (например, mongodb).

Избавляет от необходимости написания прямых запросов (хотя они все же необходимы в случае сложных манипуляций). Доступ к данным осуществляется за счет манипуляций с объектами.

Моей главной ошибкой в начале было то, что я не уделял достаточного внимания описанию ORM - сущностей(entity), просто создавая структуру в phpmyadmin и импортируя ее (как это делать описано здесь)

Entity - это некий объектный "образ" сущности, хранимой в БД. 

В простейшем случае, entity находит свое отображение в виде таблицы, но это не всегда так. Например, в случае описания сложных связей (многие ко многим, например), будет создана дополнительно промежуточная таблица связей.

Простой пример Entity (из доки симфы):

namespace AcmeStoreBundleEntity;

use DoctrineORMMapping as ORM;

/** * @ORMEntity * @ORMTable(name="product") */ class Product { /** * @ORMColumn(type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ protected $id;

/** * @ORMColumn(type="string", length=100) */ protected $name;

/** * @ORMColumn(type="decimal", scale=2) */ protected $price;

/** * @ORMColumn(type="text") */ protected $description; }

Как видим, Entity - это просто storage-класс, для полей которого с помощью аннотаций прописаны БД свойства (тип, связи, имя колонки в БД, допустимые значения и т.д.).