在Doctrine中将多个一对一关系组合在关系的反面

时间:2017-04-13 18:23:20

标签: symfony doctrine-orm doctrine

希望通过一些帮助来思考这个问题。说我在这里使用两个实体 - 用户和组。出于本示例的目的,假设每个组都有一个高级主持人和一个初级主持人,他们都是用户并且是互斥的(用户只能在一个组中,并且不能同时是高级和初级主持人)。所以在Group中,我可能有类似的东西:

class Group
{

    /**
     * 
     * @OneToOne(targetEntity="User")
     */
    private $seniorModerator;

    /**
     * 
     * @OneToOne(targetEntity="User")
     */
    private $juniorModerator;

}

现在在用户中,我并不关心用户是高级版主还是初级版主。我只是希望能够返回用户所在的组。我知道我必须在Group属性中添加mappedBys,但我有点难过,因为我知道我不能拥有两个mappedBys分配给同一个东西(例如$ group)。

这里最好的解决方案是在User中创建两个单独的逆属性(如$ group1和$ group2),然后创建一个getGroup()getter方法,只检查是否填充了其中一个属性并返回一个是

我没有想到的那种不那么粗俗的方法吗?感谢任何建议,提前谢谢。

2 个答案:

答案 0 :(得分:0)

我有类似的情况,所以我创建了第三个表,其中manyToOne为User,manyToOne为Group,一个字段表示该组的此用户是否为manager。因此,您可以执行相同的添加和两个字段,指出用户是高级还是初级。

答案 1 :(得分:0)

我认为最好的解决方案是做一对一的单向"组和用户实体中的关联,因此您的组的代码将是:

class Group
{

     private idGroup;
    /**
     * 
     * @OneToOne(targetEntity="User")
     * @JoinColumn(name="seniorModerator_id", referencedColumnName="idUser")
     */
    private $seniorModerator;

    /**
     * 
     * @OneToOne(targetEntity="User")
     * @JoinColumn(name="juniorModerator_id", referencedColumnName="idUser")
     */
    private $juniorModerator;

}

对于您的用户:

class User{
    private idUser;

    /**
    *
    * @oneToOne(targetEntity="Group")
    * @JoinColumn(name="group_id", referencedColumnName="idGroup")
    */
    private $group;
}

如果您想了解关于关联映射的更多信息hir是文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-unidirectional