我无法使用原则保留一个对象,该对象具有包含外键的复合主键



我为我的项目创建了一个ER模型,并在php中实现了它,并添加了以下maaping信息:

AppBundleEntityCompetition:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
location:
date:
type: datetime
lifecycleCallbacks: {  }
oneToMany:
runs:
targetEntity: Run
mappedBy: comp
cascade: [persist]

AppBundleEntityRun:
type: entity
id:
id:
type: integer
comp:
associationKey: true
fields:
name:
lifecycleCallbacks: {  }
manyToOne:
comp:
targetEntity: Competition
inversedBy: runs

AppBundleEntityParticipate:
type: entity
id:
athlete:
associationKey: true
run:
associationKey: true
comp:
associationKey: true
fields:
number:
type: integer
lifecycleCallbacks: {  }
manyToOne:
athlete:
targetEntity: Athlete
cascade: [persist]
run:
targetEntity: Run
cascade: [persist]
comp:
targetEntity: Run
cascade: [persist]

编辑:Run应该是一个弱实体,所以我认为我需要两个关系来Run。首先是Run本身,第二是比赛,Run属于。

使用Competition and Run就像一种魅力,我可以坚持并获取它们,但一旦我试图坚持Participate的对象,我就会得到以下错误:

不支持将具有复合主键的实体绑定到查询。您应该将参数拆分为显式字段,并分别绑定它们。

我使用以下代码:

$em = $this->getDoctrine()->getManager();
$em->persist($participate);
$em->flush();

我不知道该怎么办才能解决这个问题。

感谢

第2版:

我只是明白,理论上,我不需要Participate中的关系comp,因为它已经在Run中了,并且Run对象是唯一的。但是,如果我想相应地更新我的数据库,Doctrine会给我以下SQL:

ALTER TABLE Participate DROP FOREIGN KEY FK_8B9E3EEF4D0D3BCB;
DROP INDEX IDX_8B9E3EEF4D0D3BCB ON Participate;
ALTER TABLE Participate DROP PRIMARY KEY;
ALTER TABLE Participate DROP comp_id;
ALTER TABLE Participate ADD PRIMARY KEY (athlete_id, run_id);

这将移除Participate中的Competition的外键。但是run_id并没有被定义为唯一的,因为它应该是一个弱密钥。

这可能是因为2个manyToOne关系与targetEntity 具有相同的实体

AppBundleEntityParticipate
manyToOne:
run: targetEntity: Run
comp: targetEntity: Run

Comp应具有targrtEntity"Competition"。

相关内容

  • 没有找到相关文章