原则2.1:从子查询中获取和分配COUNT(t.id)


Doctrine 2.1: Getting and assigning COUNT(t.id) from a subquery?

我在条令2.1中有两个实体:CategorySite每个类别都有许多站点,每个站点都有一个父类别。

我想做一个单一的更新查询(在DQL中),它将用相关站点的数量更新Category实体的一个名为count的字段。

所以在SQL中,我会这样做:

UPDATE categories c SET c.count = (SELECT COUNT(s.id) FROM sites s WHERE s.category_id = c.id);

这会很好地工作,在DQL中可能是这样的:

UPDATE PackageNameBundle:Category c SET c.count = (SELECT COUNT(s.id) FROM PackageNameBundle:Site s WHERE s.category = c)

这样的尝试提出了CCD_ 4。

子查询确实在DQL中工作,但这里的问题(就我所见)是Doctrine无法将子查询的返回值分配给c.count。这是可以理解的,因为我可能会在子查询中获取多个字段,甚至多行。它在MySQL中非常有效,因为它只看到一行、一个字段,并且为了方便返回一个整数值。另一方面,条令必须面向对象,并且必须在可能不支持这种转换的情况下与不同的引擎协同工作。

最后,我的问题是:

在Doctrine中,最好的方法是什么?我应该使用Native SQL还是可以使用DQL?

提前感谢!

编辑:我刚刚在DQL文档中找到了这句话:

  • 对相关实体的引用只能在WHERE子句中使用子选择

所以,我想除了标量值之外,什么都不可能赋值?

不过,主要问题仍然存在。。

对于这种特定的查询,您也可以在Doctrine中使用本机sql查询。DQL以其自身的方式非常强大,但由于性能限制,它也受到限制。使用本机sql查询和映射结果将实现相同的效果,这样做没有任何缺点。

文档对此进行了详细解释。