让我们先描述一下我的情况。我正在使用Symfony2,我的实体之间存在关系问题。
我有两个链接在一起的实体。这两个实体是AssociationQuestion
和AssociationPossibleAnswer
。我目前正在创建一个问题软件,其中必须将左侧的一个可能答案与右侧的另一个可能答案相关联,例如在以下示例中:
目前,我计划在类AssociationQuestion
中拥有两个属性,这两个属性可以包含许多AssociationPossibleAnswer
个对象。第一个数组将包含左侧可能的答案,第二个数组将包含右侧可能的答案。
因此,对我而言,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.
我想知道这是否是在我的两个实体之间设置关系的正确方法。 是否有可能有两个属性指向实体,而实体却不知道它指向哪个属性。
答案 0 :(得分:7)
OneToMany关联无法解决此案例。
AssociationQuestion
和AssociationPossibleAnswer
之间需要2个不同的关系。你设置它的方式,你只有1个关系。只需查看您在AssociationPossibleAnswer
中创建的1 ManyToOne关联。
你试图在这个关系中有两个相反的方面,这在理论上是不可能的。关系只能有2个端点(不是3个)。
<强>解决方案强>
在AssociationQuestion
中实现2(单向)ManyToMany关联,并使指向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将此称为One-To-Many, Unidirectional with Join Table关联。