我在条令2.1中有两个实体:Category
和Site
每个类别都有许多站点,每个站点都有一个父类别。
我想做一个单一的更新查询(在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查询和映射结果将实现相同的效果,这样做没有任何缺点。
文档对此进行了详细解释。