【问题标题】:Doctrine composite primary key as part of the primary key of another entityDoctrine 复合主键作为另一个实体的主键的一部分
【发布时间】:2013-09-12 14:07:42
【问题描述】:

我有一个实体的复合主键是另一个实体的主键的一部分的特定情况。这是专业化的情况,但现在没关系。

我使用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 无法生成的数据库中的实体之一。

【问题讨论】:

  • 你所说的“复合”是什么意思?您只是将两个键串在一起还是创建了一个跨越两列的主键?
  • 能否复制问题中的实体?
  • 很抱歉回复晚了。复合是指主键跨越两列。

标签: orm doctrine-orm composite-primary-key


【解决方案1】:

您遇到了这个问题,因为您的复合外键是另一个表的复合主键。这不是一个好的开发实践,这就是 Doctrine 根本不支持它的原因,我强烈怀疑它永远不会支持。

解决方案 1(首选):

EstablecimientosSec 添加一个自动递增的主键。然后,您可以改为链接到该 EstablecimientosSec.id

解决方案 2:

如果改变数据库结构是绝对不可能的,不要映射关系。相反,您可以使用复合主键在单独的查询中获取相关的EstablecimientosSec 实体。这不是一个完美的解决方案,但它可以在这些限制下工作。提示:避免在循环中查询相关对象。

【讨论】:

  • 我刚遇到同样的问题。解决方案 1 对我来说是不可能的。解决方案 2 到底是什么意思?又该怎么做呢?
  • @craphunter 不要使用 ManyToOne 将实体链接在一起,这样 Doctrine 就不会抱怨。如果您需要从另一个表中获取相关记录,请创建一个单独的查询并使用where table2.id = ?。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多