gpt4 book ai didi

php - Doctrine 2 如何正确映射多级继承

转载 作者:搜寻专家 更新时间:2023-10-31 21:54:04 25 4
gpt4 key购买 nike

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

/**
* @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 中列出所有映射的类。

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

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

当我保存 ClassC obj 时,我保存了该属性 someName。你可以自己尝试无歧视映射,看到所有类都被映射并保存。

编辑:

还有一件事,如果你想避免多级继承,你总是可以使用trait。只需将 Prop 分组到特征并将其添加到实体。 DoctrineBehaviors 中有很好的特征用法示例捆。可以使用它向实体导入额外的功能,例如 blamableloggable 等。

关于php - Doctrine 2 如何正确映射多级继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com