gpt4 book ai didi

symfony - 使用原则 2 中的多态关系子集的多态附件

转载 作者:行者123 更新时间:2023-12-04 12:57:23 26 4
gpt4 key购买 nike

我需要一些关于使用“多态关联”的学说 2 的帮助。让我澄清一下自己。实体可以使用多态关系的子集来支持文件附件。 File 实体用于维护这种关系,其中对文件的引用作为记录存储在文件表中,并且与父模型具有多态关系。我想创建与 https://octobercms.com/docs/database/attachments 相同的功能
但不知道如何建立关系,例如如何把附件类型 动态喜欢 附件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

最佳答案

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

首先,我建议阅读学说中的继承映射 link .使用原则继承映射,您只需创建一个主文件类,然后让所有其他附件扩展它。然后,假设您要向用户添加图片附件。您只需在用户和主 File 类之间创建 oneToOne 关系。如果您保留的附件是附件类之一的实例,Doctrine 足够聪明,可以返回该类的对象,而不是主 File 类。

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

  • ImageAttachment 扩展了 FileAttachment
  • 用户有一个名为 photo
  • 的属性
  • 属性照片是与 FileAttachment 实体的 OneToOne 关系


  • 代码:
    $image = new ImageAttachment();
    $user->setPhoto($image);

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

    结果:

    现在在 User 表的数据库中,在名为 photo_id 的列中,引用的 ID 将是 FileAttachment 表中的 ID。什么时候做 $user->getPhoto();它会返回一个 ImageAttachment 类的对象,因为教义知道您已经保存了一个 ImageAttachment,而不仅仅是一个 FileAttachment。

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

    在教义中谈论多态性时要指出的第三个重要点是 symfony 对此特性的支持。一般来说,多态性在某些情况下被认为是一种不好的做法,尤其是在数据持久性方面,在社区中没有太多的支持。所以要考虑的重要一点是 symfony CollectionType 从来没有支持多态性 .基本上,如果您打算使用多态表单集合,则必须编写自己的类型。但是,如果您不介意使用一些 ajax,这不是一个真正的问题,您可以简单地避免单独使用 SF 表单。

    关于symfony - 使用原则 2 中的多态关系子集的多态附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926709/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com