学说2.1:从子查询中获取并分配COUNT(t.id)?

时间:2012-03-10 18:24:25

标签: php sql symfony doctrine-orm dql

我在Doctrine 2.1中有两个实体:CategorySite每个类别都有很多网站,每个网站都有一个父类别。

我想制作一个单独的更新查询(在DQL中),它将使用相关网站的数量更新类别实体的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)

这种尝试引发了[Syntax Error] line 0, col 61: Error: Expected Literal, got 'SELECT'

子查询在DQL中工作,但这里的问题(据我所知)是Doctrine无法将子查询返回的值分配给c.count。这是可以理解的,因为我可能在子查询中获取多于1个字段,甚至多于一行。它可以在MySQL中运行,因为它看到一行,一个字段并且为了方便起见返回一个整数值。另一方面,学说必须是面向对象的,并且必须与不同的引擎一起工作,否则可能不支持这种转换。

最后,我的问题是:

在Doctrine中执行此操作的最佳方法是什么,我应该使用Native SQL还是可以使用DQL以及如何完成?

提前致谢!

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

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

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

主要问题仍然存在..

1 个答案:

答案 0 :(得分:0)

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

The documentation详细解释。