首页 > 解决方案 > Symfony 中的原则:使用与不同实体相关的单个“作者”关联实体

问题描述

我正在使用 Symfony 5 和 Doctrine 开发自定义内容管理系统。

我正在尝试实现实体DocumentVideo(实际上还有更多,但为了简单起见,我们说只有两个)和User实体之间的关系。

该关系表示User谁编写了文档或录制了视频。所以这里的关系称为Author。每个文档或视频可以有一个或多个作者。每个用户可以没有或有更多的文档或视频。

我想只使用一个关联Author关联实体,如下所示:

entity_id|author_id|entity

在哪里:

问题是我无法理解如何在 Doctrine 中构建它。这是一个经典的SingleEntity<-->Author<-->Users关系吗?我会把它构建为一个多对多项目,但在这里它是不同的。

Author可能包含两个多对一关系(一个与User实体,一个与实体DocumentVideo实体)加上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;

我应该如何管理第一个字段?

标签: phpsymfonydoctrine-ormdoctrine

解决方案


我的建议是存储实体命名空间 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);
}

推荐阅读