Symfony2 Doctrine ORM复合主键

Gui*_*rmo 7 php orm doctrine composite-primary-key symfony

我正在使用Doctrine 2.4作为ORM 在Symfony 2.3中开发一个应用程序.我使用的数据库引擎是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
);
Run Code Online (Sandbox Code Playgroud)

定义实体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;
Run Code Online (Sandbox Code Playgroud)

//实体/ EstablecimientosSec

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

执行命令doctrine:mapping:import时出现以下错误

[Doctrine\ORM\Mapping\MappingException]无法将实体'EstablecimientoSec'与复合主键映射为另一个实体'EstablecimientoSecPlano#idEstablecimiento'的主键的一部分.

我想知道是否有任何方法可以在symfony中定义实体,而我不能用doctrine来实现.

我可以以其他方式映射功能以使应用程序正常工作吗?

我希望我的问题得到理解.谢谢

afi*_*ina 2

您遇到此问题是因为您的复合外键是另一个表的复合主键。这不是一个好的开发实践,这就是为什么它根本不受 Doctrine 支持的原因,而且我强烈怀疑它是否会得到支持。

解决方案1(首选):

将单个自动增量主键添加到EstablecimientosSec. 然后您可以链接到该链接EstablecimientosSec.id

解决方案2:

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