向 Doctrine 添加额外的外键约束



我有实体SomeMainEntity,它扩展了MainEntity。 SomeMainEntity 包含 GroupEntity 以及 SubEntity 的集合。 SQL 将是:

主实体

  • id(自动递增整数 PK(

SomeMainEntity 扩展 MainEntity

id
  • (association=true =>一对一 PK/FK 到 main_entity.id(
  • group_entity_id(多对一 FK 到 group_entity.id(

组实体

  • id(自动递增整数 PK(

子实体

  • id(自动递增整数 PK(
  • some_main_entity_id(多对一 FK 到 some_main_entity.id(
  • 名字

现在,我希望更改子实体,以便该名称对于SomeMainEntity中的给定组实体是唯一的。 我尝试了以下方法:

子实体

  • id(自动递增整数 PK(
  • some_main_entity_id(多对一 FK 到 some_main_entity.id,FK 到 some_main_entity.group_entity_id(
  • 名字

但这显然是行不通的some_main_entity因为 id/group_entity_id 显然必须是复合 PK。 此外,由于SomeMainEntity扩展了MainEntity,如果不是不可能的话,这有点棘手。 我还尝试在SomeMainEntity中创建一个唯一的密钥,但Doctrine似乎不支持(https://stackoverflow.com/a/24364419/1032531(

作为另一个尝试,我将组实体添加为子实体中的属性

子实体

  • id(自动递增整数 PK(
  • some_main_entity_id(多对一 FK 到 some_main_entity.id(
  • group_entity_id(多对一 FK 到 group_entity.id(
  • 名字

现在,我可以在名称和group_entity_id之间添加一个唯一的约束,但是,这确实是不正确的,因为它不能确保给定的关联主实体也包含相同的组实体。

如何做到这一点?

最终采用了一种更传统的SQL方法,该方法很容易使用Doctrine实现。

前三个表保持不变:

主实体

  • id(自动递增整数 PK(

SomeMainEntity 扩展 MainEntity

id
  • (association=true =>一对一 PK/FK 到 main_entity.id(
  • group_entity_id(多对一 FK 到 group_entity.id(

组实体

  • id(自动递增整数 PK(

然后添加了一个额外的表:

MainEntityHasGroupEntity

  • mainEntityId (Composite PK and FK to MainEntity.id. 添加唯一索引(
  • groupEntityId (Composite PK 和 FK to GroupEntity.id(

然后在最后一个表上使用那个额外的表:

子实体

  • id(自动递增整数 PK(
  • mainEntityId (FK to MainEntityHasGroupEntity.mainEntityId(
  • groupEntityId (FK to MainEntityHasGroupEntity.groupEntityId(
  • 名字

最新更新