3

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

/**
 * @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 文档中找到关于如何进行多级实体类继承的任何提及。

4

1 回答 1

0

我也有同样的情况。我需要不止一层的继承。在您的情况下,这是预期的行为,您需要在DiscriminatorMap.

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

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

当我保存ClassC obj 时,我保存了该属性someName。您可以尝试自己不带歧视性映射,并查看所有类都已映射并保存。

编辑 :

如果您想避免多级继承,您可以随时使用另一件事trait。只需将道具分组为特征并将其添加到实体。DoctrineBehaviors bundle中有很好的特征使用示例。有使用它来将附加功能导入到诸如blamable等实体loggable

于 2016-03-21T08:00:48.357 回答