首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >原则2如何正确映射多层次继承

原则2如何正确映射多层次继承
EN

Stack Overflow用户
提问于 2016-02-18 19:56:15
回答 1查看 2K关注 0票数 3

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

代码语言:javascript
运行
复制
/**
 * @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字段既不从数据库读取,也不持久化。

当我以这样的方式指定鉴别器映射时,我发现它是有效的:

代码语言:javascript
运行
复制
 * @ORM\DiscriminatorMap({"customer" = "CustomerUser",
 * "admin" = "AdminUser", "stock" = "StockUser", "EmployeeUser"})

它开始以这种方式工作(不需要为EmployeeUser指定区分器键-因为它是抽象的,永远不会被实例化),但是

我不喜欢魔术发生时,我不太明白:) ,所以我的问题是:这是一个正确的解决方案吗?让Doctrine知道这个类以某种方式包含在继承层次结构中吗?或者应该怎么做呢?

我还没有发现任何关于如何在Doctrine文档中进行多级别实体类继承的文章。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 08:00:48

我也有同样的情况。我需要不止一个级别的遗产。在您的示例中,您需要列出DiscriminatorMap中的所有映射类。

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

代码语言:javascript
运行
复制
abstract ClassA
abstract ClassB extends ClassA
   - protected someName
ClassC extends ClassB

当我保存ClassC obj时,ClassC someName保存了该属性。您可以在没有歧视性映射的情况下尝试自己,并看到所有类都被映射和保存。

编辑:

还有一件事,如果您想避免多级继承,可以始终使用trait。只需将道具分组为特征并将其添加到实体中即可。在DoctrineBehaviors包中有很好的使用特性的例子。还可以使用它向blamableloggable等实体导入额外的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35491194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档