多态附件使用学说2中的多态关系的子集

时间:2017-03-21 12:07:38

标签: symfony doctrine-orm filesystems polymorphic-associations

我需要一些使用“多态关联”的学说2的帮助。让我澄清一下自己。实体可以使用多态关系的子集来支持文件附件。 File实体用于保护这种关系,其中对文件的引用作为记录存储在files表中,并与父模型具有多态关系。我想创建与https://octobercms.com/docs/database/attachments相同的功能 但是不知道如何建立关系,以及如何将 attachment_type 动态设置为 attachment_id ;

 /**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToOne(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_thumbnail")
 */
private $thumbnail;


/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToOne(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_image")
 */
private $image;

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_files")
 */
private $files;

文件表的一个例子。

An example of the files table

1 个答案:

答案 0 :(得分:0)

我有一些尝试在symfony中使多态性工作(包括多态文件)的经验,此时我想我可以与您分享我的一些见解,希望他们能为您提供有关此主题的一些有用信息。

首先,我建议阅读教义link中的继承映射。使用doctrine继承映射,您只需创建一个主File类,然后使每个其他附件扩展它。然后,假设您要向用户添加图片附件。您只需在用户和主File类之间创建一个oneToOne关系。如果你持久化的附件是其中一个附件类的实例,那么Doc​​trine足够聪明,可以返回该类的对象,而不是主要的File类。

所以回答你的问题,我会给你一个具体的例子。的案例

  • ImageAttachment扩展了FileAttachment
  • 用户拥有名为photo
  • 的媒体资源
  • Property photo是与FileAttachment实体的OneToOne关系

<强>代码:

$image = new ImageAttachment();
$user->setPhoto($image);

$em->persist($user);
$em->flush();

<强>结果:

现在在User表的数据库中,在名为photo_id之类的列中,引用的ID将是FileAttachment表中的ID。当你做$ user-&gt; getPhoto();它将返回ImageAttachment类的对象,因为doctrine知道你已经持有了ImageAttachment,而不仅仅是FileAttachment。

谈到收藏,事情也会非常简单。在这种情况下,您可能需要在文件和要与文件关联的实体之间创建ManyToMany关系。假设用户可以在数据库中保存许多不同类型的附件。如果你想在这个文件系统应用程序范围内使用它,那么一个文件可能无法了解它所属的用户,因为很快文件必须保存有关所有不同类型关系的信息,这不是一个智能架构选择是否要使用任何类型的模块化系统。这就是为什么我的建议是使用某些实体和附件之间的ManyToMany关系。这样,只有用户才能知道数据库中的文件,文件系统将是不可知的和解耦的。

在谈论学说中的多态性时,第三个要点是symfony对此功能的支持。通常,在某些情况下,多态性被认为是一种不好的做法,特别是在数据持久性方面,社区中没有太多的支持。因此,需要考虑的一件重要事情是,symfony CollectionType对多态性没有任何支持。基本上,如果您计划使用多态表单集合,则必须编写自己的类型。但是如果你不介意使用一些ajax,这不是一个真正的问题,你可以简单地避免单独使用SF表单。