Symfony2/Doctrine2:在对象之间具有通用链接

Symfony2/Doctrine2:在对象之间具有通用链接,symfony,doctrine-orm,Symfony,Doctrine Orm,我对Symfony2/Doctrine2有建模问题。我目前正在尝试将整个网站从一个以前的PHP框架传递到Symfony2,在以前的框架中有一个我喜欢的概念,但我无法用Symfony和Doctrine建模 我的问题是:使用前一个框架,可以将类a的对象链接到任何其他类(B、C、D…)的任何其他对象。为此,类A有一个属性模型id,用于知道对象链接到哪个类(它对应于在每个类的配置文件中定义的唯一id),以及一个属性记录id,它是链接对象的外部id。例如,通过这种方式,可以有一个类注释和一个关于任何对象(

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

我的问题是:使用前一个框架,可以将类a的对象链接到任何其他类(B、C、D…)的任何其他对象。为此,类A有一个属性模型id,用于知道对象链接到哪个类(它对应于在每个类的配置文件中定义的唯一id),以及一个属性记录id,它是链接对象的外部id。例如,通过这种方式,可以有一个类注释和一个关于任何对象(博客文章、用户等)的注释

由于这些通用链接似乎不可能用条令关系(ManyToOne等)建模,我考虑使用一种全局方法,或者每个类都有一个方法,例如getItem,它查看属性model_id和record_id,然后返回正确的对象

但我还是有问题:

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

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

你知道我怎么会有这样一个系统,它可以将一个对象与任何其他对象进行一般性链接,然后轻松恢复链接的对象,就像它是一个“普通”原则关系一样


事先非常感谢您的帮助。

我实现类似于此的东西的方式相当简单,但并不直接:

如果要创建一个新类,我建议使用如下名称:

评论法学

在这种情况下,您可以创建指向其他对象的链接:

类别识别码
类别识别码
类c_id

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

如果您不想太担心初始对象->注释线程设置,那么我建议您:

外国身份证
外语课


有意义吗?

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

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

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

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