我为我的项目创建了一个ER模型,并在php中实现了它,并添加了以下mapping信息:
AppBundle\Entity\Competition:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
location:
date:
type: datetime
lifecycleCallbacks: { }
oneToMany:
runs:
targetEntity: Run
mappedBy: comp
cascade: [persist]
,
AppBundle\Entity\Run:
type: entity
id:
id:
type: integer
comp:
associationKey: true
fields:
name:
lifecycleCallbacks: { }
manyToOne:
comp:
targetEntity: Competition
inversedBy: runs
和
AppBundle\Entity\Participate:
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]
编辑:运行应该是一个弱实体,所以我认为我需要2个关系来运行。第一个用于Run本身,第二个用于比赛,Run属于。
使用竞争和运行就像魅力一样,我可以坚持并获取它们,但是一旦我试图坚持参与的对象,我就会收到以下错误:
不支持将具有复合主键的实体绑定到查询。您应该将参数拆分为显式字段并单独绑定它们。
我使用以下代码:
$em = $this->getDoctrine()->getManager();
$em->persist($participate);
$em->flush();
我不知道应该怎么做才能解决这个问题。
由于
EDIT2:
我只是理解,从理论上讲,我不需要comp
中的Participate
关系,因为它已经在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);
哪会删除Competition
中Participate
的外键。但run_id
未被定义为唯一,因为它应该是一个弱键。
答案 0 :(得分:0)
可能是因为2 manyToOne关系与targetEntity具有相同的实体
AppBundle\Entity\Participate
manyToOne:
run: targetEntity: Run
comp: targetEntity: Run
Comp应该有targrtEntity"竞争"。