5

这是我的基础/父母实体,因此它的孩子正在使用他们自己的表格。单个表继承实体是否可以扩展一个类表继承实体?

 
/** 
* @ORM\Entity 
* @ORM\Table(name="layer_object") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"service"="Service", "aircraft"="Aircraft", ...}) 
*/ 
class LayerObject {} 

飞机实体。一个做得好的简单小孩

 
/** 
* @ORM\Entity 
* @ORM\Table(name="aircraft") 
*/ 
class Aircraft extends LayerObject 

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

 
/** 
* @ORM\Entity 
* @ORM\Table(name="service") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"}) 
*/ 
class Service extends LayerObject {} 

服务实体

 
/** 
* @ORM\Entity 
*/ 
class Ground extends Service {} 


app/console doctrine:schema:validate的孩子没有发现错误,但是app/console doctrine:schema:update --force只是不会产生“服务”表中,应使用单独的表中的一个继承。看起来像服务实体定义简单地被忽略。

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

任何人都可以在某个方向指向我吗?谢谢。

发现重复的,但目前还没有答案为止,请参阅:Doctrine 2 multiple level inheritance

编辑:
当我使用类表继承了(为Service实体@ORM\InheritanceType("JOINED"))第2级太它工作得好。请参阅:Doctrine2 Multiple level inheritance

回答

4

你试图实现的是纯粹的映射不可能实现的。

用于文档Class Table InheritanceSingle Table Inheritance清楚阐明:

的@InheritanceType,@DiscriminatorColumn和@DiscriminatorMap必须 可以在最顶层的即映射的实体 层次结构的一部分指定。

您可能能够通过实现subscriberloadClassMetaDataevent动态改变继承型(即基于注解子实体),以使这项工作。

一些进一步的灵感可以在this article找到。

+0

非常感谢。这基本上意味着:'在最顶层的类中选择一种继承类型并坚持下去'。现在这对我的应用程序来说很好... – virtualize