在Doctrine中添加其他外键约束

时间:2019-10-06 19:39:49

标签: symfony doctrine-orm doctrine

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

MainEntity

  • id(自动递增整数PK)

SomeMainEntity扩展MainEntity

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

GroupEntity

  • id(自动递增整数PK)

SubEntity

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

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

SubEntity

  • 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

作为另一种尝试,我将GroupEntity添加为SubEntity中的属性

SubEntity

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

现在,我可以在name和group_entity_id之间添加唯一的约束,但这确实不对,因为它不能确保给定的关联MainEntity也包含相同的GroupEntity。

这怎么实现?

1 个答案:

答案 0 :(得分:0)

最终采用了更传统的SQL方法,该方法易于使用Doctrine实施。

前三个表保持不变:

MainEntity

  • id(自动递增整数PK)

SomeMainEntity扩展MainEntity

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

GroupEntity

  • id(自动递增整数PK)

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

MainEntityHasGroupEntity

  • mainEntityId(将PK和FK添加到MainEntity.id。添加唯一索引)
  • groupEntityId(到GroupEntity.id的PK和FK复合)

然后在最后一张桌子上使用该多余的桌子:

子实体

  • id(自动递增整数PK)
  • mainEntityId(从FK到MainEntityHasGroupEntity.mainEntityId)
  • groupEntityId(从FK到MainEntityHasGroupEntity.groupEntityId)
  • 名称