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

Doctrine 2 how to properly map multi-level inheritance

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

/**
 * @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 知道这个 class 以某种方式包含在继承层次结构中?还是应该以其他方式完成?

我没有在 Doctrine 文档中找到关于如何进行多级实体 class 继承的任何提及。

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

我的案例没有那个映射,因为我正在使用 ClassName 的本机转换来键入键,并且它在所有继承级别上都适用于 类。

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

当我保存 ClassC 对象时,我保存了 属性 someName。你可以不带歧视的map自己试试,看到所有类都映射出来保存了。

编辑:

还有一件事,如果你想避免多级继承,你总是可以使用 trait。只需将道具分组到特征并将其添加到实体。 DoctrineBehaviors bundle 中有很好的 trait 使用示例。有使用它来向 blamableloggable 等实体导入额外的功能