单个表继承实体可以扩展类表​​继承实体吗?

时间:2013-12-03 18:58:15

标签: symfony doctrine-orm symfony-2.3 single-table-inheritance class-table-inheritance

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

/**
 * @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只是不会生成'service'表,应该使用单表继承。似乎简单地忽略了服务实体定义。

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

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

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

修改
当我对第二级使用类表继承时(@ORM\InheritanceType("JOINED")实体使用Service)它的效果非常好。请参阅:Doctrine2 Multiple level inheritance

1 个答案:

答案 0 :(得分:5)

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

Class Table InheritanceSingle Table Inheritance的文档明确指出:

  

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

您可以通过向loadClassMetaData subscriber实施event来动态更改继承类型(即基于子实体的注释),从而使这项工作成为可能。

this article可以找到更多灵感。