Doctrine 2如何正确映射多级继承

时间:2016-02-18 19:56:16

标签: php inheritance doctrine-orm doctrine nette

我有这样的多级继承学说实体:

/**
 * @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中进行多级实体类继承的提及。

1 个答案:

答案 0 :(得分:0)

我有同样的情况。我需要不止一个级别的继承。在您的情况下,这是预期的行为,您需要列出DiscriminatorMap中的所有映射类。

我的情况没有那个地图,因为我使用ClassName的原生转换来键入key,它在所有继承级别的类上工作。

abstract ClassA
abstract ClassB extends ClassA
   - protected someName
ClassC extends ClassB

当我保存 ClassC obj时,我保存了该属性 someName 。您可以在没有歧视性地图的情况下尝试自己,并查看所有类都已映射并保存。

编辑:

如果你想避免多级继承,还可以使用trait。只需将道具分组为特征并将其添加到实体。在DoctrineBehaviors捆绑中有一个很好的特征使用示例。可以使用它将其他功能导入blamableloggable等实体。