繁体   English   中英

与类型 Symfony Doctrine 的多对多关系

[英]ManyToMany Relationship With Type Symfony Doctrine

我有这种实体结构

class Group
{
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private string $name;
}


class GroupUser
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var Group
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="GroupUser")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
     */
    private Group $group;

    /**
     * @var string
     * @ORM\Column(type="string", length=50, nullable=false)
     */
    private string $type;

    /**
     * @var int
     * @ORM\Column(type="integer", nullable=false)
     */
    private int $user;

}

并且有两种类型的用户。 管理员和客户。 组和用户之间存在多对多关系。 GroupUser $type 中的属性正在保存管理员或客户端的 Class,而 $user 属性正在保存 id。

ID group_id 用户 类型
1 1 1 实体\管理员
2 2 1 实体\客户

如何从管理员和客户端使用 doctrine 加入它? 或者也许有人可以指出一些资源,这种关系如何在 doctrine 上起作用? 因为我很难用谷歌搜索任何东西。 我想它可能就像一个有条件的leftJoin,但我似乎无法弄清楚。

通常,您不能在数据库上执行此操作,因为它不安全。 为什么不安全? 因为您可以在userGroup表的user列中有一个id ,因为它没有链接,所以它没有引用任何内容。

我会写出你应该做的事情,以及如何使用自己的方法实现你想要的:

您应该做什么:在您的UserGroup实体中,有 2 列( adminclient )链接到相关实体。 它们可以是 null( Client是 null,如果是管理员,则admin包含admin实体的 ID,反之亦然)。 然后你可以删除type

如何使用您的方法实现您的目标:由于无法在数据库中完成,您必须在某个管理器中完成。 有一个方法getUser它将检查您的type属性并从存储在$user中的当前 id 返回关联的实体

例子:

    public function getUserFromGroupUser(GroupUser $groupUser){
        if('Entity\Admin' ===$groupUser->getType()){
            return $this->adminRepository->find($groupUser->getUser());
        }
        if('Entity\Client' ===$groupUser->getType()){
            return $this->ClientRepository->find($groupUser->getUser());
        }
        throw new \RuntimeException('the type does not exist');
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM