php - 两个属性与一个实体共享相同的 OneToMany 关系 Symfony2

标签 php symfony doctrine-orm one-to-many many-to-one

先说说我的情况吧。我正在使用 Symfony2,我的实体之间的关系有问题。

我有两个链接在一起的实体。这两个实体是 AssociationQuestionAssociationPossibleAnswer。我目前正在创建一个问题软件,其中必须将左侧的一个可能答案链接到右侧的另一个可能答案,例如以下示例:

目前,我计划在 AssociationQuestion 类中使用两个数组属性,它们将包含许多 AssociationPossibleAnswer 对象。第一个数组将包含左侧的可能答案,第二个数组将包含右侧的可能答案。

因此,对我来说,看起来我会在 AssociationQuestion

中有两个 oneToMany 关系
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 关联解决。

AssociationQuestionAssociationPossibleAnswer 之间需要 2 个不同的关系。按照您设置的方式,您只有 1 个关系。只需查看您在 AssociationPossibleAnswer 中创建的 1 ManyToOne 关联。

而您正试图让 1 个关系有 2 个相反的边,这在理论上是不可能的。一个关系只能有 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;

    // ...

学说称之为 One-To-Many, Unidirectional with Join Table协会。

关于php - 两个属性与一个实体共享相同的 OneToMany 关系 Symfony2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21445505/

相关文章:

php - 使用 php 检测浏览器的最佳方法是什么?

javascript - Google API 多作用域

php - 仅在某些行之间将 csv 导入到 mysql

php - Symfony - 覆盖字段选项(required = false 到 required = true)

javascript - 是否使用全局 npm

php - 根据模式声明使用 Doctrine2 创建表和实体

javascript - PHP 中的 Jquery

symfony - 唯一实体不起作用

mysql - 当 null 时,如何让带有 where not 子句的 Doctrine 查询生成器返回值

php - 使用原则保存多条记录并获取每条记录的 ID