Doctrine relations

В данной статье мы составим схему и разберемся, с нюансами.

Для начала рассмотрим виды связей.

"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 позволяют настроить отношения на противоположном конце, как я понимаю это возможность указать все настройки в одной из сущностей (чтобы не указывать их в другой).

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


29.01.2014 10:52

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru