我为我的项目创建了一个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"。