主义多态关联

时间:2011-01-31 17:53:30

标签: doctrine

我有一个名为forums的表,其中包含以下字段结构:

  1. object_type - > [组|页面|比赛| etc ....](可能的值。每个元素都有自己的表)

  2. object_id - > [小组的id |页面的ID |锦标赛的id | etc ..](id object_type)

  3. id_forum,4.name等

  4. 然后我有以下表格:GroupPageTournament等。

    是否可以用doctrine实现这个?

3 个答案:

答案 0 :(得分:7)

这应该是评论,但我的声誉太低,抱歉。

不幸的是,多态关联与CTI(类表继承)并不完全相同:CTI要求所有子类具有相同id的父表。

在大多数情况下,CTI可能会起作用,但如果您想在已拥有自己的ID和/或可能具有不同ID类型的现有实体之间创建多态关联,则可能会出现问题。

除了CTI要求在父表中为每个子类创建一条记录,这对于多态关联是无用的。多态关联不应该需要任何表,它应该只是加入具有(id,type)条件的现有表。我认为,出于简单/性能原因,Doctrine需要父表。

当CTI不是解决方案时,我建议在存储库级别模拟多态关联,即创建一个带有$ type属性的抽象存储库,并实现一个polymorphicJoin方法,该方法会自动将当前查询与目标表连接到id /类型条件。然后使用您的子类Repositories扩展抽象存储库,并在需要的find / select方法中调用polymorphicJoin方法。

如果在Doctrine中实现了这种关联,那将是非常棒的。

答案 1 :(得分:5)

我认为你要找的东西可以用继承来完成。

检查http://www.doctrine-project.org/docs/orm/2.0/en/reference/inheritance-mapping.html以获取详细说明。

答案 2 :(得分:0)

我有类似的问题。我在this post中发布了一个关于如何在Doctrine 2.2中实现多态关联的完整示例。