我有这样的多级继承学说实体:
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"customer" = "CustomerUser",
* "admin" = "AdminUser", "stock" = "StockUser"})
*/
abstract class User { ... }
/** @ORM\Entity */
abstract class EmployeeUser extends User { ... }
/** @ORM\Entity */
class AdminUser extends EmployeeUser { ... }
/** @ORM\Entity */
class StockUser extends EmployeeUser { ... }
然而,这种方式不起作用,EmployeeUser的字段既不从数据库读取也不保留。
当我以这种方式指定鉴别器地图时,我发现它有效:
* @ORM\DiscriminatorMap({"customer" = "CustomerUser",
* "admin" = "AdminUser", "stock" = "StockUser", "EmployeeUser"})
它开始以这种方式工作(没有必要为EmployeeUser指定鉴别器密钥 - 因为它是抽象的,永远不会被实例化),但是
我不喜欢当魔法发生时我不能理解:) 所以我的问题是:这是一个合适的解决方案吗?让Doctrine知道这个类以某种方式包含在继承层次结构中?或者应该以其他方式完成?
我还没有找到关于如何在Doctrine docs中进行多级实体类继承的提及。
答案 0 :(得分:0)
我有同样的情况。我需要不止一个级别的继承。在您的情况下,这是预期的行为,您需要列出DiscriminatorMap
中的所有映射类。
我的情况没有那个地图,因为我使用ClassName的原生转换来键入key,它在所有继承级别的类上工作。
abstract ClassA
abstract ClassB extends ClassA
- protected someName
ClassC extends ClassB
当我保存 ClassC obj时,我保存了该属性 someName 。您可以在没有歧视性地图的情况下尝试自己,并查看所有类都已映射并保存。
编辑:
如果你想避免多级继承,还可以使用trait
。只需将道具分组为特征并将其添加到实体。在DoctrineBehaviors捆绑中有一个很好的特征使用示例。可以使用它将其他功能导入blamable
,loggable
等实体。