我有这样的多层次继承原则实体:
/**
* @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文档中进行多级别实体类继承的文章。
发布于 2016-03-21 08:00:48
我也有同样的情况。我需要不止一个级别的遗产。在您的示例中,您需要列出DiscriminatorMap中的所有映射类。
我的例子没有这个映射,因为我使用ClassName的本机转换来键入键,并且它在所有继承级别上都适用于类。
abstract ClassA
abstract ClassB extends ClassA
- protected someName
ClassC extends ClassB当我保存ClassC obj时,ClassC someName保存了该属性。您可以在没有歧视性映射的情况下尝试自己,并看到所有类都被映射和保存。
编辑:
还有一件事,如果您想避免多级继承,可以始终使用trait。只需将道具分组为特征并将其添加到实体中即可。在DoctrineBehaviors包中有很好的使用特性的例子。还可以使用它向blamable、loggable等实体导入额外的功能。
https://stackoverflow.com/questions/35491194
复制相似问题