Doctrine 1.x relations

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: MySQL

В данной статье мы составим схему один-ко-многим разбиремся, с нюансами. Итак, сначала немного теории.

Что за странный атрибут onDelete и каким может быть поведение ON DELETE для внешних ключей. Doctrine поддерживает CASCADE, SET NULL и RESTRICT.

CASCADE - при удалении записи из job удалит все записи, которые на нее ссылаются в этой связи, т.е. все записи, у которых будет этот идентификатор (в данном случае job_id).

SET NULL - оставит при удалении все зависимые записи, но сбросит им идентификатор в NULL, т.е. ссылаться на удаленную запись они перестанут.

RESTRICT - просто не даст вам удалить запись, на которую ссылаются какие-либо другие записи в этой связи. пока вы не удалите все до единой зависимые записи.

Теперь разберемся с видами связей.

«one-to-one», как ясно следует из названия — это когда одной записи в ведущей таблице всегда соответствует только одна запись в ведомой. и не более того. соответственно, идентификатор у них одинаковый. используется на практике редко, начинающими практически никогда default/smile служит для того, чтобы разгрузить основную таблицу от редко используемых и массивных полей и сделать ее быстрой для выборок.

«one-to-many», «many-to-one» — одно и тоже, только с разных сторон. в любом случае сторона «one» всегда ведущая, так что правильный вариант — «one-to-many». одной записи в ведущей таблице соотвествует ни одной или более записей в ведомой. самый распространенный вариант древовидной структуры.

«many-to-many» соответственно, выглядит как вариант «one-to-many + many-to-one», когда с любой стороны каждой записи может привязываться несколько записей из противоположной таблицы. Скажем, если представить себе абстрактную пару «команда» — «матч», то применительно к большинству спортивных игр, одному матчу всегда принадлежат две команды, но каждая из команд может играть в многих матчах. типичная связь м-м.

И на последок, составим one-to-many схему, а именно:

  • Таблица Modules (id, name)
  • Таблица ModulesData (id, module_id, name, value)
Modules:
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    name:
      type:     string(32)
      unique:   true
      notnull:  true
  relations:
    ModulesData:
       class: ModulesData
       local: id
       foreign: module_id
       type: many
       foreignType: one
       alias: ModulesData
       foreignAlias: Modules
       onDelete: CASCADE

ModulesData:
  columns:
    module_id:
      type:     integer(4)
      notnull:  true
    name:
      type:     string(32)
    value:
      type:     string()
  relations:
    Modules:
      class: Modules
      local: module_id
      foreign: id
      type: one
      foreignType: many
      alias: Modules
      foreignAlias: ModulesData
      onDelete: CASCADE

А теперь закономерные вопросы и ответы на них.


Вопрос: зачем нужно заполнять class, если мы и так указываем его немного выше?

Ответ: класс нужен тогда, когда у вас две связи на одну и ту же таблицу. На грубом абстрактном примере: скажем у forum_post может быть как user_id, так и moderator_id, оба они указывают на таблицу user, но на разные записи. В этом случае вам придется назвать связи не так, как называется таблица, и указать в обоих один класс user.


Вопрос: зачем нужно заполнять alias, если мы и так указываем его немного выше?

Ответ: алиасы нужны, чтобы давать максимально короткие и удобные имена связям, вместо sfGuardProfile — просто Profile в связи с User. Их можно вообще не указывать, но тогда придется обращаться к связям по их полному имени. Также алиасы никак не относятся к типам, они просто — короткие названия, для удобства. Чтобы писать потом $user->Profile() вместо $user->sfGuardProfile() для обращения к связанным моделям.

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

Удачки в разработке!

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты