gpt4 book ai didi

php - Symfony2 Doctrine ORM 复合主键

转载 作者:可可西里 更新时间:2023-11-01 13:00:11 25 4
gpt4 key购买 nike

我正在使用 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
);

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

//实体/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;

//实体/EstablecimientosSec

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

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

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

我想知道是否有任何方法可以在 symfony 中定义实体,我不能用 Doctrine 来做。

我能否以另一种方式映射功能以使应用程序正常工作?

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

最佳答案

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

方案一(首选):

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

解决方案 2:

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

关于php - Symfony2 Doctrine ORM 复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17042897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com