【问题标题】:Symfony2/Doctrine2 : Having generic links between objectsSymfony2/Doctrine2:对象之间有通用链接
【发布时间】:2023-03-28 10:47:01
【问题描述】:

我遇到了 Symfony2/Doctrine2 的建模问题。我目前正在尝试将整个网站从以前的 PHP 框架传递到 Symfony2,并且在以前的框架中有一个我喜欢但我无法用 Symfony 和 Doctrine 建模的概念。

这是我的问题:使用以前的框架,可以将 A 类的对象链接到任何其他类(B、C、D...)的任何其他对象。为此,类 A 有一个属性 model_id 来知道该对象链接到哪个类(它对应于在配置文件中为每个类定义的唯一 id),以及一个属性 record_id,它是链接对象的外部 id .这样,例如,可以有一个类 Comment 并对任何对象(博客文章、用户等)进行评论。

由于这些通用链接似乎无法用 Doctrine 关系(ManyToOne 等)建模,因此我考虑拥有 - 就像在前一个框架中一样 - 一种全局方法或每个类的方法,例如 getItem,它查看属性 model_id 和 record_id 然后返回正确的对象。

但我又遇到了问题:

  • 我不能直接在 Entity 中定义这个方法,因为我不应该在 Entity 类中访问数据库。

  • 如果我在全局服务中定义一次,或者为存储库中的每个类定义 n 次 - 这是可能的,因为这次我可以访问数据库 - 我将能够在任何地方调用该方法,但在实体代码。它使实现变得非常丑陋,因为这意味着在我之前的示例中,需要访问评论的实体的所有方法都必须从实体移动到存储库。最后,我将在存储库中而不是直接在实体中拥有几乎所有的对象方法。

你有什么想法我可以有一个这样的系统,它允许一般地将一个对象链接到任何其他对象,然后轻松地恢复链接的对象,就像它是一个“通常”的学说关系?

非常感谢您的帮助。

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    问题是您的解决方案意味着我们提前知道对象 A 将链接到对象 B、C 等。但是,我想要实现的是一个我们事先不知道什么的解决方案将成为链接,我们有可能在对象 A 和新创建的类 Z 的对象之间创建新链接,而无需更改类 A 和 Z 中的任何内容。这样,如果我以前面的示例为例,您可以正确地对任何对象进行评论,而无需在类 Comment 和其他类之间建立直接关系。

    我想我找到了解决这个问题的方法:

    我所做的是实现一个 Listener,每次从 Doctrine 加载实体时都会触发事件 postLoad。另一方面,我的实体有一个属性 $item ,它是我们还不知道类的链接项目。 在 postLoad 事件中,我们通过 model_id 和 record_id 在数据库中查找链接项目的类并返回对象本身,然后在 Doctrine 返回实体之前填充 $item 属性。这样,每次我们从 Doctrine 获取一个实体时,实体和项目之间的“假”链接是由自动事件建立的,这适用于每个实体。 使用相同的原理,我们可以使用每次更新实体时触发的 postUpdate 事件来更新链接。它将手动更新数据库中的“假”链接。

    有关更多信息,我建议阅读以下页面:

    【讨论】:

      【解决方案2】:

      我实现与此类似的方法相当简单,但并不完全直截了当:

      你会创建一个新类,我会提议一个类似的名字:

      评论主题注册表

      您可以将链接链接到其他对象:

      class_a_id
      class_b_id
      class_c_id

      这使您可以将其与其他多个相关联。您一次只能使用一个远程 ID,但它可以让您跨对象使用它并利用 orm。

      如果您不想太担心初始对象->comment_thread 设置,那么我建议您可能只是:

      foreign_id
      外国类

      有意义吗?

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多