6

这是我的基础/父实体,设置它的子实体使用他们自己的表。

/**
 * @ORM\实体
 * @ORM\Table(name="layer_object")
 * @ORM\InheritanceType("已加入")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"service"="Service", "aircraft"="Aircraft", ...})
 */
类层对象 {}

飞机实体。一个简单的孩子,做得很好

/**
 * @ORM\实体
 * @ORM\Table(name="飞机")
 */
飞机类扩展了 LayerObject

服务实体。一个复杂的孩子,它本身正在使用单表继承。

/**
 * @ORM\实体
 * @ORM\Table(name="服务")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"})
 */
类服务扩展 LayerObject {}

服务实体的子实体

/**
 * @ORM\实体
 */
地面类扩展服务{}


app/console doctrine:schema:validate没有发现错误,但app/console doctrine:schema:update --force不会生成“服务”表,该表应该使用单表继承。似乎服务实体定义被简单地忽略了。

当然我可以手动为这个表创建 SQL,但是应用程序会增长,在某些时候我需要使用迁移。

有人能指出我的方向吗?谢谢。

找到了一个重复的,但是目前还没有答案,请看:Doctrine 2 multi level inheritance

编辑:
当我也将类表继承用于第二级(@ORM\InheritanceType("JOINED")对于Service实体)时,它工作得很好。参见:Doctrine2 多级继承

4

1 回答 1

6

纯映射无法实现您想要实现的目标。

类表继承单表继承的文档清楚地指出:

@InheritanceType、@DiscriminatorColumn 和 @DiscriminatorMap 必须在作为映射实体层次结构的一部分的最顶层类上指定。

您可以通过实现动态更改继承类型的事件的订阅者(即基于子实体的注释)来完成这项工作。loadClassMetaData

在这篇文章中可以找到一些进一步的灵感。

于 2013-12-04T00:05:12.830 回答