Je vais exposer le cas avec l'exemple (ce sera plus clair): J'ai 'Groupies' (puisque le groupe est un nom réservé) et je avoir des entreprises. Un Groupie peut choisir plusieurs Sociétés, et les mêmes sont inversées (association ManyToMany typique). La chose est: J'ai besoin de persister quelques données supplémentaires qui sont spécifiques de l'association elle-même (appelons-le 'Choice'). Ainsi, le ManyToMany est remplacé par deux paires d'associations OneToMany/ManyToOne, et maintenant chaque 'choix' n'a qu'un seul 'groupie' et une seule compagnie. Les métadonnées de doctrine pour chaque classe sont:Diviser une association ManyToMany en 2 paires de OneToMany/ManyToOne (Doctrine)
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
Le problème est, quand je lance le COMAND:
php app/console doctrine:schema:update --dump-sql
ne semble reconnaître l'un des deux relations (groupies):
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);
Je vais certainement faire quelque chose de mal, mais je ne pourrais pas Ne pas trouver comment diviser un ManyToMany en deux paires d'associations OneToMany/ManyToOne en détail. De cette façon, il semble que les dernières métadonnées 'manyToOne' dans Choice.orm.yml écrasent les précédentes. En effet, si j'écris d'abord le groupie 'manyToOne' puis celui de la compagnie, alors ce dernier (entreprise) est la seule clé étrangère dans la table de choix!