我有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次 - 这是可能的,因为这次我可以访问数据库 - 我将能够在任何地方调用该方法,但是实体代码。并且它使得实现非常难看,因为这意味着在我之前的示例中,需要访问Comments的Entity的所有方法必须从Entity移动到Repository。最后,我将在Repository中拥有几乎所有的对象方法,而不是直接在Entity中。
你是否知道我如何拥有这样一个系统,它允许将一个对象一般地链接到任何其他对象,然后轻松恢复链接对象,就像它是一个“通常的”学说关系一样?
非常感谢您的帮助。
答案 0 :(得分:2)
事情是你的解决方案意味着我们事先知道对象A将被链接到对象B,C等。但是,我想要实现的是一个我们事先不知道什么的解决方案将成为链接,我们有可能在对象A和新创建的类Z的对象之间创建一个新的链接而不更改类A和Z中的任何内容。这样,如果我采用我之前的示例,那么可以正确地对任何对象进行注释,而不会在类注释和其他类之间建立直接关系。
我认为我找到了解决这个问题的方法:
我所做的是实现监听器,事件 postLoad ,每次从Doctrine加载实体时都会触发。另一方面,我的实体有一个属性$ item,它是我们还不知道该类的链接项。 在postLoad事件中,我们通过model_id和record_id来查看数据库,链接项的类是什么,并返回对象本身,然后在Doctrine返回实体之前填充$ item属性。这样,每次我们从Doctrine获取实体时,实体和项目之间的“假”链接都是由自动事件构建的,这适用于每个实体。 使用相同的原则,我们可以使用postUpdate事件更新链接,该事件会在每次更新实体时触发。它将手动更新数据库中的“假”链接。
有关详细信息,建议您阅读以下页面:
答案 1 :(得分:0)
我实现类似于此的方式相当容易,但不是很直接:
你会创建一个新类,我会提出一个名字:
CommentTopicRegistry
因为你会链接到其他对象:
class_a_id
class_b_id
class_c_id
这使您可以将其与多个其他关联。您一次只能使用其中一个远程ID,但它允许您跨对象使用它并利用orm。
如果您不想太担心初始对象> comment_thread设置,那么我建议也许只是:
foreign_id
foreign_class
有意义吗?