在Doctrine2中的计算实体?

时间:2013-03-23 22:20:34

标签: mysql inheritance doctrine-orm doctrine associations

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

背景

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

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

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

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

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

问题

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

1 个答案:

答案 0 :(得分:1)

不,使用Doctrine ORM无法处理这种逻辑。 ORM在静态类型的实体中进行思考,这些实体是关联的并且具有唯一标识符(来自实体的定义)。

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

你能做的是:

  1. 定义mysql级视图
  2. 创建标记为@Entity(readOnly=true)的实体,在刷新时将被ORM忽略
  3. 这样,ORM将能够使用普通persisters从您的实体读取数据,并且您将能够在关联中使用对象的标识符。

    如果计算了您的实体类型,请考虑在视图中使用鉴别器列模拟single table inheritance