【问题标题】:How can I do complex entity associations queries in doctrine 2? (virtual entity)如何在学说 2 中进行复杂的实体关联查询? (虚拟实体)
【发布时间】:2011-12-04 16:29:31
【问题描述】:

假设我有一个博客应用程序。
作者可以通过提供指向网络上现有图片的网址的链接或上传新图片来将多张图片添加到帖子中。

我希望能够从图像(上传的或 url)回溯到使用该图像的所有帖子,以及从特定帖子回溯到该帖子中的所有图像(例如 - 所以我可以删除图像是非法的和/或暂停使用它们的帖子,直到作者修复帖子)。

但是,我对上传的图片和 url 图片使用不同的实体 - 上传的图片比 url 图片包含更多关于图片的数据。

这会导致更复杂的代码,因为在每次保存已编辑的帖子时,我需要检查哪种是特定图像(在我需要运行的帖子中的所有图像中),然后创建或更新它记录,并分配给post实体中的关系字段。

所以...假设我有一个UploadedImage 和一个UrlImage 实体,我考虑在post 实体中有一个setImages 方法,该方法检查它获得的每张图片,如果它是上传的或url ,然后调用setUploadedImagessetUrlImages

但是,我需要某种虚拟的images 存储库,以同样的方式加载图像。

听起来有点复杂,我想知道:

  1. 我怎样才能拥有一个虚拟的学说实体(及其存储库和所有)?
  2. 有更好的设计吗?

【问题讨论】:

  • 你考虑过使用Inheritance Mapping吗?
  • @Orbling 以哪种方式?以及它将如何解决决定如何处理每种类型的“问题”?
  • 嗯,通过使用继承映射,您可以拥有一个代表这两种类型的超类,然后可以将它们一起处理。根据子类型,它们可以有相同的方法并做不同的事情。
  • Doron 是正确的,这正是继承的意义所在。您有一个基实体类(或映射的超类),它提供两种类型共有的所有功能。然后,UrlImage 和 UploadedImage 都可以提供自己的方法实现,例如 getUrl()。您还可以使用其他将图像(无论哪种类型)作为参数的方法,例如 'flagAllPostsContainingImage($Image)`
  • 对我个人来说,为什么 Post 实体应该以某种方式连接到 UploadedImage 很有趣?它应该只关心 UrlImage

标签: php database-design associations doctrine-orm


【解决方案1】:

这是您尝试执行的操作的文档:
http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

它描述了单表继承与类表继承。 您的情况适合后一种情况,但也可以考虑迁移到单表继承。

如果这些图像的(代码)用户对它们一视同仁,无论其来源如何,增加的查询复杂性和数据库使用将不值得规范化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2011-07-18
    • 1970-01-01
    • 2015-06-18
    • 2014-12-21
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多