2014-01-30 3 views
5

Lassen Sie uns zuerst meine Situation beschreiben. Ich verwende Symfony2 und ich habe ein Problem mit einer Beziehung zwischen meinen Entitäten.Zwei Attribute, die dieselbe OneToMany-Beziehung mit einer Entität teilen Symfony2

Ich habe zwei Entitäten, die miteinander verbunden sind. Die zwei Entitäten sind AssociationQuestion und AssociationPossibleAnswer. Ich bin derzeit ein questionary Software zu schaffen, wo man hätte eine mögliche Antwort auf der linken Seite auf einen anderen eine mögliche Antwort auf der rechten Seite, wie im folgenden Beispiel verknüpfen:

Derzeit plane ich auf zwei Attribute, die Arrays in Klasse AssociationQuestion sind, die viele AssociationPossibleAnswer Objekte enthalten würde. Das erste Array würde die möglichen Antworten auf der linken Seite enthalten und das zweite würde die möglichen Antworten auf der rechten Seite enthalten.

Deshalb mir, es sieht aus wie ich zwei OneToMany Beziehungen in AssociationQuestion

AssociationQuestion: 

    oneToMany: 
     possibleAnswersLeft: 
      targetEntity: AssociationPossibleAnswer 
      mappedBy: associationQuestion 

     possibleAnswersRight: 
      targetEntity: AssociationPossibleAnswer 
      mappedBy: associationQuestion 

Dann in AssociationPossibleAnswer hätte, würde ich eine ManyToOne Beziehung hat:

AssociationPossibleAnswer: 
    manyToOne: 
     associationQuestion: 
      targetEntity: AssociationQuestion 

Das Problem ist, dass Ich bekomme den folgenden Fehler, wenn ich versuche, meine Lehre zu bestätigen. Es scheint, dass Sie nicht zwei Einheiten zu einem verknüpft haben können, wie ich ...

* The field AssociationQuestion#possibleAnswersLeft is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity AssociationPossibleAnswer#associationQuestion does not contain the required 'inversedBy=possibleAnswersLeft' attribute. 

* The field AssociationQuestion#possibleAnswersRight is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity AssociationPossibleAnswer#associationQuestion does not contain the required 'inversedBy=possibleAnswersRight' attribute. 

Ich frage mich tun würde wollen, ob dies der richtige Weg ist meine Beziehung zwischen meinen beiden Entitäten zu setzen. Ist es möglich, zwei Attribute zu haben, die auf eine Entität verweisen, während die Entität im Gegenzug nicht weiß, auf welches Attribut verwiesen wird.

Antwort

7

Dieser Fall kann nicht mit OneToMany-Zuordnungen gelöst werden.

Sie benötigen 2 eindeutige Beziehungen zwischen AssociationQuestion und AssociationPossibleAnswer. So wie du es eingerichtet hast, hast du nur 1 Beziehung. Sehen Sie sich die 1 ManyToOne-Verbindung an, die Sie in AssociationPossibleAnswer erstellt haben.

Und Sie versuchen, 2 entgegengesetzte Seiten dieser 1 Beziehung zu haben, was theoretisch unmöglich ist. Eine Relation kann nur 2 Endpunkte haben (nicht 3).

Lösung

Implement 2 (unidirektional) ManyToMany Verbände in AssociationQuestion und machen den fremden Schlüssel auf AssociationPossibleAnswer einzigartig:

class AssociationQuestion 
{ 

    /** 
    * @ORM\ManyToMany(targetEntity="AssociationPossibleAnswer") 
    * @ORM\JoinTable(name="association_question_association_possible_answer_left", 
    *  joinColumns={@ORM\JoinColumn(name="association_question_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="association_possible_answer_id", referencedColumnName="id", unique=true)} 
    *) 
    */ 
    private $possibleAnswersLeft; 

    /** 
    * @ORM\ManyToMany(targetEntity="AssociationPossibleAnswer") 
    * @ORM\JoinTable(name="association_question_association_possible_answer_right", 
    *  joinColumns={@ORM\JoinColumn(name="association_question_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="association_possible_answer_id", referencedColumnName="id", unique=true)} 
    *) 
    */ 
    private $possibleAnswersRight; 

    // ... 

Lehre nennt dies einen One-To-Many, Unidirectional with Join Table Verein.

Verwandte Themen