Давайте сначала опишем мою ситуацию. Я использую 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.
Мне интересно, если это правильный способ установить мои отношения между двумя моими сущностями. Возможно ли иметь два атрибута, указывающих на сущность, в то время как в конце объект не знает, с какого атрибута он указывает.
Этот случай не может быть разрешен с помощью ассоциаций OneToMany.
Вам нужно 2 различных отношения между AssociationQuestion
и AssociationPossibleAnswer
. Как вы его настроили, у вас есть только одно отношение. Просто посмотрите на 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; // ...
Доктрина называет это ассоциацией « Одно-ко-многим», однонаправленной с объединенной таблицей .