【问题标题】:Doctrine 2 how to properly map multi-level inheritanceDoctrine 2 如何正确映射多级继承
【发布时间】:2016-02-18 19:56:15
【问题描述】:

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

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

【问题讨论】:

  • 看起来不错。如果在DiscriminatorMap 中定义, "employee" = "EmployeeUser" 会怎样?也许 Doctrine 要求每个子实体都有一个鉴别器。反正我不知道是否支持多级继承,不能只用2级吗?

标签: php inheritance doctrine-orm doctrine nette


【解决方案1】:

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

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

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

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

编辑:

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

【讨论】:

  • 谢谢,我不知道可以避免指定鉴别器映射。当然,这是最舒适的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多