2014-04-19 4 views
0

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!

Répondre

1

Vous avez votre réponse dans votre question:

groupe toutes les associations de même type sous le même niveau d'indentation.

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