Doctrine复合主键作为另一个实体的主键的一部分

3

我有一个具体的情况,其中一个实体的复合主键是另一个实体的主键的一部分。这是一种特殊情况,但现在并不重要。

我使用Doctrine从数据库生成实体,但是Doctrine不支持将复合外键作为主键:

It is not possible to map entity 'XXXXX' with a composite primary key as part of the primary key of another entity 'YYYYYY#id_xxxxx'

有人知道这种情况的解决方案吗?可以使用Doctrine解决方案或编辑模型和数据库结构。

更新1

CREATE TABLE `amandman` (
  `iddokumenta` int(11) NOT NULL,
  `datumdostavljanjaskupstini` date NOT NULL,
  `tekst` text,
  `datumizmene` date DEFAULT NULL,
  `izmenjenitekst` text,
  `iddokumentapredlogazakona` int(11) DEFAULT NULL,
  `datumdostavljanjaskupstinipredlogazakona` date DEFAULT NULL,
  PRIMARY KEY (`iddokumenta`,`datumdostavljanjaskupstini`),
  KEY `iddokumentapredlogazakona_idx`           (`iddokumentapredlogazakona`,`datumdostavljanjaskupstinipredlogazakona`),
  CONSTRAINT `iddokumenta45` FOREIGN KEY (`iddokumenta`, `datumdostavljanjaskupstini`)     REFERENCES `dokument` (`iddokument`, `datumdostavljanjaskupstini`) ON DELETE NO ACTION ON     UPDATE CASCADE,
 CONSTRAINT `iddokumentapredlogazakona` FOREIGN KEY (`iddokumentapredlogazakona`, `datumdostavljanjaskupstinipredlogazakona`) REFERENCES `predlogzakona` (`iddokumenta`, `datumdostavljanjaskupstini`) ON DELETE NO ACTION ON UPDATE CASCADE) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是数据库中无法使用Doctrine生成的实体之一。


1
你说的“composite”是什么意思?你只是把两个键串在一起,还是创建了一个跨越两列的主键? - Adder
请问您能否复制一下实体吗? - user2359967
抱歉回复晚了。通过复合键,我指的是跨越两列的主键。 - poletn23
2个回答

8
你遇到了这个问题,是因为你的复合外键是另一个表的复合主键。这不是一个好的开发实践,这就是为什么Doctrine不支持它,我强烈怀疑它永远也不会被支持。
解决方案1(首选):
EstablecimientosSec 中添加一个单一的自增主键。然后你可以链接到那个 EstablecimientosSec.id
解决方案2:
如果绝对不可能改变数据库结构,请不要映射关系。相反,你可以使用复合主键从另一个查询中获取相关的 EstablecimientosSec 实体。这不是一个完美的解决方案,但在这些限制下它是可行的。提示:避免在循环的一部分查询相关对象。

我刚遇到同样的问题,解决方案1对我不可行。你具体指的解决方案2是什么?怎么做呢? - craphunter
1
@craphunter 不要使用ManyToOne将实体链接在一起,这样Doctrine就不会抱怨了。如果您需要从其他表中获取相关记录,请创建一个单独的查询并使用where table2.id = ?。这有帮助吗? - afilina

-1
外键是其他表中的主键,为什么这不是一个好的做法呢? 解决方案是从数据库中删除外键关系,然后手动添加它。如果您正在使用级联更新或类似功能,则需要这样做,否则您可以通过代码而不是表之间的关系来控制更新/删除。

你的回答可以通过添加更多支持信息来改进。请[编辑]以添加更多细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接