CakePHP - другой имеет много через отношения - PullRequest
0 голосов
/ 06 декабря 2010

Мне было интересно, возможно ли это сделать с множеством через

contents       orgs            folders
 id             id              id
 name           name            title
 link

join table - folder_elements
              id
              element_id
              order

у содержимого много папок через folder_elements

orgs имеет много папок через folder_elements

Поэтому мой вопрос: возможно ли использовать element_id для хранения content.id или org.id?

Alex

1 Ответ

4 голосов
/ 06 декабря 2010

То, что вы описываете, является своего рода ассоциацией HABTM (HasAndBelongsToMany).Вы можете определить межмодельные ассоциации, как вы предлагаете, но есть довольно существенный недостаток проекта: как бы вы учитывали ситуацию, когда один и тот же идентификатор используется для записи orgs и записи contents, и хотите связатьих с той же folder записью?Было бы невозможно провести различие между этими двумя в вашей объединяющейся таблице.

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

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

  • Content hasMany ContentsFolder belongsTo Folder
  • Folder hasMany ContentsFolder belongsTo Content
  • Org hasMany OrgsFolder belongsTo Folder
  • Folder hasMany OrgsFolder belongsTo Org

Это внутренняя структура ассоциации HABTM, определенная явно, поэтому вы можете определять поля в присоединяемой таблице.Ваши таблицы contents и folders останутся прежними, но две соединяемые таблицы будут выглядеть так:

contents_folders
-> id
-> content_id
-> order

orgs_folders
-> id
-> org_id
-> order

К сожалению, да, для этого потребуется определить пять моделей вместо трех, но таковыограничения объектно-реляционного моделирования CakePHP.

...