1

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

背景

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

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

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

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

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

问题

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

4

1 回答 1

1

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

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

你可以做的是:

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

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

如果您的实体类型是计算出来的,请考虑在视图中使用鉴别器列模拟单个表继承。

于 2013-03-24T16:17:59.860 回答