我將以例子揭示案例(它會更清晰): 我有'羣組'(因爲羣組是一個保留名稱),而我有公司。一個Groupie可能會選擇幾家公司,而相同的公司則相反(典型的ManyToMany分組)。將ManyToMany關聯分割成2對OneToMany/ManyToOne(Doctrine)
事情是:我需要堅持一些額外的數據,特別是協會本身(我們稱之爲'選擇')。因此,ManyToMany被兩對OneToMany/ManyToOne協會取代,現在每個'選擇'只有一個'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
問題是,當我運行的COMAND:
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'然後是公司,那麼最後一個(公司)是選擇表中唯一的外鍵!