这是我的基本/父实体,设置所以它的子节点使用自己的表.
/** * @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多级继承
编辑:
当我为第二级使用类表继承时(@ORM\InheritanceType("JOINED")
对于Service
实体),它工作得很好.请参阅:Doctrine2多级继承
纯映射无法实现您想要实现的目标.
类表继承和单表继承的文档清楚地说明:
必须在作为映射实体层次结构一部分的最顶层类上指定@InheritanceType,@ DisciminatorColumn和@DiscriminatorMap .
您可以通过实现动态更改继承类型的事件的订阅者(即基于子实体的注释)来完成此工作.loadClassMetaData
在本文中可以找到一些进一步的灵感.