我在Doctrine 2.1中有两个实体:Category
和Site
每个类别都有很多网站,每个网站都有一个父类别。
我想制作一个单独的更新查询(在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文档中找到了这句话:
所以,我想除了标量值之外什么都不可能分配?
主要问题仍然存在..
答案 0 :(得分:0)
对于那种特定的查询,您也可以在Doctrine中使用本机SQL查询。 DQL以其自身的方式强大,但由于性能限制,它也受到限制。使用本机sql查询并映射结果将实现相同的目的,并且这样做没有任何缺点。
The documentation详细解释。