Php 原则2如何正确映射多级继承

Php 原则2如何正确映射多级继承,php,inheritance,doctrine-orm,doctrine,nette,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 Us

我有这样的多级继承原则实体:

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


我在条令文档中没有发现任何关于如何进行多级实体类继承的内容。

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

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

abstract ClassA
abstract ClassB extends ClassA
   - protected someName
ClassC extends ClassB
当我保存ClassCobj时,我保存了该属性someName。您可以自己尝试,而不必使用歧视性映射,并查看所有类都已映射和保存

编辑:


还有一件事,如果你想避免多级继承,你可以使用
trait
来实现。只需将道具分组到trait并将其添加到entity。在bundle中有很好的特性使用示例。有人使用它向实体导入额外的功能,如
可指责的
可记录的
等。

看起来不错。如果您在
DiscriminatorMap
中定义
,“employee”=“EmployeeUser”
,该怎么办?可能条令要求每个子实体都有一个鉴别器。无论如何,我不知道是否支持多层次的继承,你不能只使用两个层次吗?谢谢,我不知道可以避免指定鉴别器映射。当然,这是最舒适的解决方案。