Symfony 中的原则:使用与不同实体相关的单个“作者”关联实体
Doctrine in Symfony: use a single “Author” associative entity related to different entities
我正在使用 Symfony 5 和 Doctrine 开发自定义内容管理系统。
我正在尝试实现实体 Document
和 Video
之间的关系(实际上还有很多,但为了简单起见,我们假设只有两个)和 User
实体。
该关系表示 User
撰写文档或录制视频的人。所以这里的关系叫做Author
。每个文档或视频可以有一个或多个作者。每个用户可以拥有 none 或更多文档或视频。
我想只使用一个关联Author
关联实体,像这样:
entity_id|author_id|entity
其中:
entity_id
: 是文档或视频的id
author_id
:user_id
是实体的创作者
entity
:是一个常量,如 document
或 video
以了解关系指的是哪个实体
问题是我无法理解如何在 Doctrine 中构建它。这是经典的 SingleEntity<-->Author<-->Users
关系吗?我会将其构建为 ManyToMany 项目,但这里有所不同。
Author
可能包含两个 ManyToOne 关系(一个与 User
实体,一个与 Document
或 Video
实体)加上 entity type
字段,但我真的不知道如何编写“Documentor
Video`”部分的代码。我的意思是:
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity=??????????, inversedBy="authors")
* @ORM\JoinColumn(nullable=false)
*/
private $entity; // Document or Video
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="articles")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\Column(type="smallint")
*/
private $entityType;
我应该如何管理第一个字段?
我的建议是存储实体命名空间Ex。 Acme\Entity\Document
在 属性 中,id 在另一个中,并使用实体管理器获取实体。
编辑:虽然你不会有这种关系,但我更喜欢这种方式而不是其他方式,因为它可以重复使用并且性能相当相同。另外,如果我需要将它传递给 JSON 响应,我只需创建一个规范化器就可以了。
/**
* @ORM\Column(type="string")
*/
private $entityNamespace;
/**
* @ORM\Column(type="integer")
*/
private $entityId;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function getEntity()
{
return $this->em->getRepository($this->entityNamespace)->find($this->entityId);
}
不知道将其存储在两个不同的属性下是否会更好。如果不是强制性的,我认为那些“对象”应该有一个通用的接口或其他东西,所以看看 doctrine inheritance 应该满足你的需求
我正在使用 Symfony 5 和 Doctrine 开发自定义内容管理系统。
我正在尝试实现实体 Document
和 Video
之间的关系(实际上还有很多,但为了简单起见,我们假设只有两个)和 User
实体。
该关系表示 User
撰写文档或录制视频的人。所以这里的关系叫做Author
。每个文档或视频可以有一个或多个作者。每个用户可以拥有 none 或更多文档或视频。
我想只使用一个关联Author
关联实体,像这样:
entity_id|author_id|entity
其中:
entity_id
: 是文档或视频的idauthor_id
:user_id
是实体的创作者entity
:是一个常量,如document
或video
以了解关系指的是哪个实体
问题是我无法理解如何在 Doctrine 中构建它。这是经典的 SingleEntity<-->Author<-->Users
关系吗?我会将其构建为 ManyToMany 项目,但这里有所不同。
Author
可能包含两个 ManyToOne 关系(一个与 User
实体,一个与 Document
或 Video
实体)加上 entity type
字段,但我真的不知道如何编写“Documentor
Video`”部分的代码。我的意思是:
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity=??????????, inversedBy="authors")
* @ORM\JoinColumn(nullable=false)
*/
private $entity; // Document or Video
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="articles")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\Column(type="smallint")
*/
private $entityType;
我应该如何管理第一个字段?
我的建议是存储实体命名空间Ex。 Acme\Entity\Document
在 属性 中,id 在另一个中,并使用实体管理器获取实体。
编辑:虽然你不会有这种关系,但我更喜欢这种方式而不是其他方式,因为它可以重复使用并且性能相当相同。另外,如果我需要将它传递给 JSON 响应,我只需创建一个规范化器就可以了。
/**
* @ORM\Column(type="string")
*/
private $entityNamespace;
/**
* @ORM\Column(type="integer")
*/
private $entityId;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function getEntity()
{
return $this->em->getRepository($this->entityNamespace)->find($this->entityId);
}
不知道将其存储在两个不同的属性下是否会更好。如果不是强制性的,我认为那些“对象”应该有一个通用的接口或其他东西,所以看看 doctrine inheritance 应该满足你的需求