Два атрибута, использующие одно и то же отношение OneToMany к одному объекту Symfony2

Сначала опишу мою ситуацию. Я использую Symfony2, и у меня проблема с отношениями между моими сущностями.

У меня есть две сущности, которые связаны друг с другом. Две сущности: AssociationQuestion и AssociationPossibleAnswer. В настоящее время я создаю программное обеспечение для опроса, в котором нужно связать один возможный ответ слева с другим возможным ответом справа, например, в следующем примере:

В настоящее время я планирую иметь два атрибута, которые представляют собой массивы в классе AssociationQuestion, которые будут содержать множество объектов AssociationPossibleAnswer. Первый массив будет содержать возможные ответы слева, а второй — возможные ответы справа.

Поэтому мне кажется, что у меня будет два отношения oneToMany в AssociationQuestion

AssociationQuestion:

    oneToMany:
        possibleAnswersLeft:
            targetEntity: AssociationPossibleAnswer
            mappedBy: associationQuestion

        possibleAnswersRight:
            targetEntity: AssociationPossibleAnswer
            mappedBy: associationQuestion

Тогда в AssociationPossibleAnswer у меня будет одно отношение ManyToOne:

AssociationPossibleAnswer:
    manyToOne:
        associationQuestion:
            targetEntity: AssociationQuestion

Проблема в том, что я получаю следующую ошибку, пытаясь подтвердить свою доктрину. Кажется, что у вас не может быть двух объектов, связанных с одним, как я хотел бы сделать...

* 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.

Мне интересно, правильно ли это установить отношения между двумя моими сущностями. Возможно ли иметь два атрибута, указывающих на объект, в то время как взамен объект не знает, из какого атрибута он указывает.


person Etienne Noël    schedule 30.01.2014    source источник


Ответы (1)


Этот случай нельзя решить с помощью ассоциаций OneToMany.

Вам нужны 2 различных отношения между AssociationQuestion и AssociationPossibleAnswer. То, как вы это настроили, у вас есть только 1 отношение. Просто взгляните на 1 ассоциацию ManyToOne, которую вы создали в AssociationPossibleAnswer.

И вы пытаетесь иметь две противоположные стороны одного отношения, что теоретически невозможно. Отношение может иметь только 2 конечные точки (не 3).

Решение

Реализуйте 2 (однонаправленные) ассоциации ManyToMany в AssociationQuestion и сделайте внешний ключ, указывающий на AssociationPossibleAnswer, уникальным:

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;

    // ...

Doctrine называет это Один-ко-многим, однонаправленный с ассоциацией "Присоединиться к таблице".

person Jasper N. Brouwer    schedule 01.02.2014