php - Symfony 中的原则:使用与不同实体相关的单个“作者”关联实体
问题描述
我正在使用 Symfony 5 和 Doctrine 开发自定义内容管理系统。
我正在尝试实现实体Document
和Video
(实际上还有更多,但为了简单起见,我们说只有两个)和User
实体之间的关系。
该关系表示User
谁编写了文档或录制了视频。所以这里的关系称为Author
。每个文档或视频可以有一个或多个作者。每个用户可以没有或有更多的文档或视频。
我想只使用一个关联Author
关联实体,如下所示:
entity_id|author_id|entity
在哪里:
entity_id
: 是文档或视频的idauthor_id
: 是user_id
创建实体的人entity
: 是一个常数,喜欢document
或video
知道关系指的是哪个实体
问题是我无法理解如何在 Doctrine 中构建它。这是一个经典的SingleEntity<-->Author<-->Users
关系吗?我会把它构建为一个多对多项目,但在这里它是不同的。
Author
可能包含两个多对一关系(一个与User
实体,一个与实体Document
或Video
实体)加上entity type
字段,但我真的不知道如何编写“文档or
视频”部分。我是说:
/**
* @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);
}
推荐阅读
- javascript - 使用nodejs服务器命中角度路线时出错
- python - 无法导入名称“etree”
- c++ - 离散傅里叶变换 C++
- c# - 用 mathnet 解决一般特征问题
- jquery - 如何在jQuery代码中使用用角度定义的数组
- javascript - 如何调试 JavaScript 对象问题?
- java - java listFiles() 只返回文件
- http - ASP.Net Core 2(.1.2) - 无需信任客户端即可保存用户数据
- javascript - 如何在 Angular Typescript 中访问此关键字
- javascript - 用 JavaScript 写这个有没有一种不那么复杂的方式?