【问题标题】:Computed entity, in Doctrine2?计算实体,在 Doctrine2 中?
【发布时间】:2013-03-23 22:20:34
【问题描述】:

在 Doctrine2 中,有没有一种方法可以创建基于复杂 sql 查询结果的计算实体?

背景

在我正在处理的应用程序中(在我加入项目之前存在),有一个概念: 属性(属于属性,有很多属性,overrides属性) catalogItem(属于catalogItem,有很多catalogItem,有很多属性)

这个想法是catalogItem 有它自己的层次结构,目前达到4 级深度。 每个catalogItem 都继承其父级的属性,但这些属性(也有自己的层次结构)可以在任何时候被覆盖。 这个被覆盖的层次结构随后被直接的 catalogItem 使用,它也是子项,具有创建覆盖的相同能力。

因此,直接关联的典型结构在这里毫无用处,因为我们总是需要查看计算的最终结果。

所以,我的问题是,我希望能够将这些计算结果注入 Doctrine2,然后可以将其用作标准实体,能够正常遍历关系等。

这不能作为 MySQL 视图来完成,因为性能下降。此外,创建计算结果的查询相当复杂,为了提高性能,任何过滤(例如,通过 X 目录项)都发生在第三级嵌套子查询以及顶级查询以及子查询的存在表示普通的 MySQL 视图直接不兼容(尽管有变通方法)。

问题

我希望能够在 Doctrine2 中创建一个实体,而不是现有的“表”,而是存在实际的 MySQL 查询,并将作为子查询运行。 我还没有在 Doctrine2 中看到任何实现我所描述的东西的方法,我希望有人可以提出解决方案或解决方法来实现类似的结果?

【问题讨论】:

  • 请注意,我已经将复杂的 SQL 查询设置为 Doctrine2 本机查询,并映射到实体中以获取结果。不过,这并不是我真正想要的,因为它不能作为一个可以与之关联的实体存在。我正在寻找一个允许计算实体充当普通 Doctrine2 实体的结果。

标签: mysql inheritance doctrine-orm doctrine associations


【解决方案1】:

不,没有办法用 Doctrine ORM 处理这种逻辑。 ORM 考虑关联并具有唯一标识符(来自实体的定义)的静态类型实体。

此外,这些实体的值和类型不应动态更改,因为 ORM 无法处理类型转换。

你可以做的是:

  1. 定义 mysql 级视图
  2. 创建一个标记为 @Entity(readOnly=true) 的实体,刷新时 ORM 将忽略该实体

这样,ORM 将能够使用普通的persisters 从您的实体中读取数据,并且您将能够在关联中使用对象的标识符。

如果您的实体类型是计算出来的,请考虑在您的视图中模拟带有鉴别器列的single table inheritance

【讨论】:

  • STI/继承不适用于此处。当我说数据被计算时,也就是说,我试图反映任何给定目录项的属性树的状态。由于 MySQL 的限制,视图是不够的,而且我似乎无法在 Doctrine2 中指定仅查询方法。实际上,如果允许我覆盖默认持久化器,我可以,但在 Doctrine2 中还不允许这样做......
  • @JonL。那么无论如何你都需要回退到 NativeSQL。无论如何,这就是持久化者所做的(内部)
  • 这就是我要解决的问题,因为学说实体不提供对实体管理器的访问,这意味着 NativeQuery 会使使用复杂化。似乎有点输/输的情况:-\
  • @JonL。好吧,当您达到工具的极限时,就会发生这种情况。然后,您可能希望将这些关联移至服务层。
  • 这就是我必须做的。 Doctrine2 的限制似乎每天都在变得更加明显,所以我发现我不得不为在另一个 ORM/AR 工具中很容易解决的情况想出糟糕的解决方法,比如 Yii 自己的 ActiveRecord。 (例如,在 Yii 中可以很容易地映射“具有多个直通”的关系,而在 Doctrine2 中则不然)。呸...任何人,我将您的答案标记为正确。您对 Propel v. Doctrine 有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2013-12-19
  • 2011-11-13
相关资源
最近更新 更多