将ManyToMany关联拆分为2对OneToMany / ManyToOne(Doctrine)

时间:2014-04-19 22:32:18

标签: php symfony orm doctrine-orm doctrine

我将用示例公开案例(它会更清楚): 我有'追星族'(因为群组是保留名称),我有公司。 Groupie可以选择几家公司,反之亦然(典型的ManyToMany asociation)。

问题是:我需要保留一些特定于关联本身的额外数据(让我们称之为'选择')。因此,ManyToMany被两对OneToMany / ManyToOne asociations取代,现在每个'选择'只有一个'groupie'和一个公司。每个类的学说元数据是:

Company.orm.yml:

Acme\AppBundle\Entity\Company:
  type: entity
  #fields...
  oneToMany:
      choices:
        targetEntity: Acme\AppBundle\Entity\Choice
        mappedBy: company

Groupie.orm.yml:

Acme\AppBundle\Entity\Groupie:
  type: entity
  #fields...
  oneToMany:
      choices:
        targetEntity: Acme\AppBundle\Entity\Choice
        mappedBy: groupie

Choice.orm.yml:

Acme\AppBundle\Entity\Choice:
  type: entity
  #fields...
  manyToOne:
    company:
      targetEntity: Acme\AppBundle\Entity\Company
      inversedBy: choices
  manyToOne:
     groupie:
      targetEntity: Acme\AppBundle\Entity\Groupie
      inversedBy: choices

问题是,当我运行命令时:

php app/console doctrine:schema:update --dump-sql

似乎只认识到两种关系中的一种(群体):

CREATE TABLE choice (id INT AUTO_INCREMENT NOT NULL, groupie_id INT DEFAULT NULL, creationDate DATE NOT NULL, orderNumber SMALLINT NOT NULL, numberOfAccounts SMALLINT NOT NULL, INDEX IDX_43CA0AD68D0C5D40 (choice_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE choice ADD CONSTRAINT FK_43CA0AD68D0C5D40 FOREIGN KEY (groupie_id) REFERENCES groupie (id);

我当然做错了什么,但我找不到如何将ManyToMany分成两对OneToMany / ManyToOne关联的细节。这样,似乎Choice.orm.yml中的最后一个'manyToOne'元数据覆盖了之前的元数据。事实上,如果我首先写的是群组'manyToOne'然后是公司的,那么最后一个(公司)是选择表中唯一的外键!

1 个答案:

答案 0 :(得分:1)

您的答案中有答案:

将同一类型的所有关联分组到相同的缩进级别。

Acme\AppBundle\Entity\Choice:
   type: entity
   #fields...
   manyToOne:
     company:
      targetEntity: Acme\AppBundle\Entity\Company
      inversedBy: choices
     groupie:
      targetEntity: Acme\AppBundle\Entity\Groupie
      inversedBy: choices