2013-03-23 118 views
1

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

背景

在我正在开发的应用(存在我加入该项目之前),有一个概念: 属性(属于属性,有许多属性,覆盖属性) catalogItem(属于catalogItem,有很多catalogItem,有很多属性)

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

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

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

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

问题

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

+0

请注意,我已经将我复杂的SQL查询设置为Doctrine2原生查询,并将其映射到结果的实体中。但这并不是我想要的,因为它并不是一个可以与之相关的实体。我正在寻找一个允许计算实体作为普通Doctrine2实体的结果。 – 2013-03-23 22:27:10

回答

1

没有,有没有办法来处理这样的逻辑与学说ORM。 ORM认为在静态类型的实体中是相关的并且具有唯一标识符(来自实体的定义)。

而且,价值观和这些实体的类型不应该动态地改变,因为ORM无法处理类型转换。

你可以做的是:

  1. 定义一个mysql级视图
  2. 创建标记为@Entity(readOnly=true)的实体,这将是由ORM上冲

这个被忽略方式,ORM将能够使用正常的persisters从您的实体读取数据,并且您将能够在关联中使用您的对象的标识符。

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

+0

STI /继承不适用于此。当我说数据是计算出来的,也就是说,我试图反映任何给定catalogItem的属性树的状态。由于MySQL的限制,一个视图是不够的,看起来我不能在Doctrine2中指定一个只能查询的方法。实际上,如果允许我重写默认持续时间,但是这在Doctrine2中是不允许的... – 2013-03-25 04:12:23

+0

@JonL。那么无论如何您都需要回退到NativeSQL。这是一个持续不断的(内部) – Ocramius 2013-03-25 05:12:19

+0

这就是我想要解决的问题,因为教义实体不提供对Entity Manager的访问,这意味着NativeQuery会使用起来变得复杂。似乎有点失去/失去的情况: - \ – 2013-03-26 03:01:32