这是我的基本/父实体,设置为使其子实体使用自己的表。
/***@ORM\实体*@ORM\Table(name="layer_object")*@ORM\InheritanceType("JOINED")*@ORM\DiscriminatorColumn(name="discr",type="string")*@ORM\DiscriminatorMap({"service"="service","aircraft"="aircraft",…})*/类LayerObject{}
飞机实体。一个简单的孩子做得很好
/***@ORM\实体*@ORM\Table(name="aircraft")*/class Aircraft扩展LayerObject
服务实体。一个复杂的子级,它本身正在使用单表继承。
/***@ORM\实体*@ORM\Table(name="service")*@ORM\InheritanceType("SINGLE_TABLE")*@ORM\DiscriminatorColumn(name="discr",type="string")*@ORM\DiscriminatorMap({"地面"="地面","机载"="机载")*/类服务扩展LayerObject{}
服务实体的子级
/***@ORM\实体*/类地面扩展服务{}
app/console doctrine:schema:validate
没有发现错误,但app/console doctrine:schema:update --force
只是不会生成"服务"表,即应该使用单表继承的表。似乎服务实体定义被简单地忽略了。
当然,我可以手工为这个表创建SQL,但应用程序会增长,在某个时候我需要使用迁移。
有人能给我指个方向吗?谢谢
发现了一个重复,但到目前为止还没有答案,请参阅:条令2多级继承
编辑:
当我也将类表继承用于第二级(@ORMInheritanceType("JOINED")
用于Service
实体)时,它工作得很好。请参阅:Doctrine2多级继承
您想要实现的是纯映射无法实现的。
类表继承和单表继承的文档清楚地指出:
@InheritanceType、@DiscriminatorColumn和@DiscrimentorMap必须在最顶层的类上指定,该类是映射实体的一部分等级制度
您可以通过实现loadClassMetaData
事件的订阅者来实现这一点,该订阅者动态地更改继承类型(即基于子实体的注释)。
在这篇文章中可以找到一些进一步的启示。