这是我的基础/父实体,设置所以它的孩子正在使用他们自己的表。
/** * @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
答案 0 :(得分:5)
纯映射无法实现您想要实现的目标。
Class Table Inheritance和Single Table Inheritance的文档明确指出:
@ InheritanceType,@ DisciminatorColumn和@DiscriminatorMap必须 在作为映射实体一部分的最顶层类中指定 层次结构。
您可以通过向loadClassMetaData
subscriber实施event来动态更改继承类型(即基于子实体的注释),从而使这项工作成为可能。
this article可以找到更多灵感。