[英]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 列( admin
和client
)链接到相关实体。 它们可以是 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.