Добавление дополнительного ограничения внешнего ключа в Doctrine - PullRequest
0 голосов
/ 06 октября 2019

У меня есть сущность SomeMainEntity, которая расширяет MainEntity. SomeMainEntity содержит GroupEntity, а также коллекцию SubEntity. SQL будет:

MainEntity

  • id (целое число автоинкремента PK)

SomeMainEntity расширяет MainEntity

  • id (ассоциация= true => один-к-одному от PK / FK до main_entity.id)
  • group_entity_id (от многих к одному FK до group_entity.id)

GroupEntity

  • id (целое число автоинкремента PK)

SubEntity

  • id (целое число автоинкремента PK)
  • some_main_entity_id (много-к-одному FKto some_main_entity.id)
  • name

Теперь я хочу изменить SubEntity, чтобы имя было уникальным для данного GroupEntity в SomeMainEntity. Я попробовал следующее:

SubEntity

  • id (целочисленное автоинкрементное PK)
  • some_main_entity_id (FK для some_main_entity.id, FK для some_main_entity. group_entity_id)
  • name

Но это, очевидно, не сработает, потому что some_main_entity id / group_entity_id, очевидно, должно быть составным PK. Кроме того, поскольку SomeMainEntity расширяет MainEntity, это становится немного сложнее, если не невозможно. Я также пытался создать уникальный ключ в SomeMainEntity, но Doctrine, похоже, не поддерживает (https://stackoverflow.com/a/24364419/1032531)

В качестве другой попытки я добавил GroupEntity как свойство в SubEntity

SubEntity

  • id (целое число с автоинкрементом PK)
  • some_main_entity_id (FK "многие-к-одному" к some_main_entity.id)
  • group_entity_id (много-к-одному FK-group_entity.id)
  • name

Теперь я могу добавить уникальное ограничение между name и group_entity_id, однако это действительно неправильно, поскольку оно не гарантирует, что данный связанный MainEntity также содержит то же самоеGroupEntity.

Как это можно сделать?

1 Ответ

0 голосов
/ 09 октября 2019

Закончилось использование более традиционного подхода SQL, который было легко реализовать с помощью Doctrine.

Первые три таблицы остались прежними:

MainEntity

  • id (целое число с автоинкрементом PK)

SomeMainEntity расширяет MainEntity

  • id (association = true => один-к-одному PK/ FK в main_entity.id)
  • group_entity_id (FK в group_entity.id)

GroupEntity

  • id (автоинкремент целое число PK)

Затем добавлена ​​дополнительная таблица:

MainEntityHasGroupEntity

  • mainEntityId (составные PK и FKв MainEntity.id. Добавить индекс UNIQUE)
  • groupEntityId (Композитный ПК и FK в GroupEntity.id)

И затем использовать эту дополнительную таблицу в последней таблице:

SubEntity

  • id (целое число автоинкремента PK)
  • mainEntityId (от FK до MainEntityHasGroupEntity.mainEntityId)
  • groupEntityId (от FK до MainEntityHasGroupEntity.groupEntityId)
  • name
...