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