Symfony2 Doctrine ORM 复合主键

7

我正在使用Symfony 2.3Doctrine 2.4作为ORM开发应用程序。我使用的数据库引擎是PostgreSQL。当在其他表中映射具有组合主键的实体时,我遇到了问题。这些键是相关键中的外键。

我的数据库中的表具有以下结构

CREATE TABLE public.establecimiento
(
  id_establecimiento integer NOT NULL,
  establecimiento character varying(100) NOT NULL,
  CONSTRAINT pk_establecimiento PRIMARY KEY (id_establecimiento )
)
WITH (
  OIDS=FALSE
);
CREATE TABLE public.establecimiento_sec
(
  id_establecimiento_sec integer NOT NULL,
  id_establecimiento integer NOT NULL,
  det_seccion character varying(40) NOT NULL,
  plano character varying(100),
  sector_ingreso character varying(254),
  sponsor_imagen_sec character varying(96000),
  CONSTRAINT pk_establecimientos_sec PRIMARY KEY (id_establecimiento_sec , id_establecimiento ),
  CONSTRAINT fk_establec_reference_establec FOREIGN KEY (id_establecimiento)
      REFERENCES public.establecimiento (id_establecimiento) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
)
WITH (
  OIDS=TRUE
);
CREATE TABLE public.establecimiento_sec_plano
(
  id_establecimiento_sec_plano integer NOT NULL,
  id_establecimiento_sec integer NOT NULL,
  id_establecimiento integer NOT NULL,
  det_plano character varying(512),
  cantidad integer NOT NULL,
  precio double precision,
  insert_charge double precision DEFAULT 0,
  descr character varying(254),
  CONSTRAINT pk_establecimiento_sec_plano PRIMARY KEY (id_establecimiento_sec_plano , id_establecimiento_sec , id_establecimiento ),
  CONSTRAINT fk_establecimiento_sec FOREIGN KEY (id_establecimiento, id_establecimiento_sec)
      REFERENCES public.establecimiento_sec (id_establecimiento, id_establecimiento_sec) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE
)
WITH (
  OIDS=FALSE
);

定义实体establecimientoSecPlano,$establecimientoSec变量包含键$establecimiento和$id_establecimiento_sec。

//实体/EstablecimientosSecPlano

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\EstablecimientosSec")
 * @ORM\JoinColumns(
 *      @ORM\JoinColumn(name="id_establecimiento_sec", referencedColumnName="id_establecimiento_sec"),
 *      @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento")) 
 */
private $establecimientoSec;

//实体/机构部门

 /**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\Establecimientos")
 * @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento") 
 */
private $establecimiento;

执行命令doctrine:mapping:import时,我遇到了以下错误:
[Doctrine\ORM\Mapping\MappingException]无法将实体“EstablecimientoSec”映射为另一个实体“EstablecimientoSecPlano#idEstablecimiento”的复合主键的一部分。
我想知道在Symfony中是否有定义实体的其他方法,而不是使用Doctrine。是否可以以其他方式映射功能以使应用程序正常工作?
希望我的问题能够被理解。谢谢。

有帮助的可能吗?http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html - Denis de Bernardy
尝试了探索该解决方案,但没有成功,无论如何还是谢谢@Denis。 - Guillermo
1
您可以通过为所有表分配独立的、自动生成的单列ID,并使用id_establecimiento_sec_planoid_establecimiento_secid_establecimiento作为字段来解决此问题(您不需要在多个表/实体中拥有相同的字段,因为您可以使用关系访问它们)。如果我正确理解了您的问题的话。 - schemar
1个回答

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

抱歉回复晚了,最终我使用了解决方案1。谢谢! - Guillermo

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