我无法使用包含外键

时间:2016-06-14 15:14:54

标签: symfony doctrine-orm foreign-keys composite-primary-key persist

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

哪会删除CompetitionParticipate的外键。但run_id未被定义为唯一,因为它应该是一个弱键。

1 个答案:

答案 0 :(得分:0)

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

AppBundle\Entity\Participate
  manyToOne:
    run: targetEntity: Run
    comp: targetEntity: Run

Comp应该有targrtEntity"竞争"。