在doctrine查询构建器中使用保留关键字作为别名

时间:2018-02-16 10:32:29

标签: doctrine-orm

$em->createQueryBuilder()
->select("MIN(m.price) AS min")
->addSelect('MAX(m.price) AS max')
->from('AppBundle:Sites', 'm');`

我怎样才能逃脱分钟才能完成这项工作?我尝试将min别名更改为_min,但应该有更好的方法。

我尝试了单引号和反引号,但都没有奏效。

2 个答案:

答案 0 :(得分:2)

您无法使用minmax作为别名,因为DQL的当前语法根本无法使用它。您可以在section of the documentation that is defining the grammar of DQL中找到此信息。在那里你会发现以下内容:

Select Expressions中:

SimpleSelectExpression  ::= (...) [["AS"] AliasResultVariable]

Identifiers中:

/* Alias ResultVariable declaration (the "total" of "COUNT(*) AS total") */
AliasResultVariable = identifier

最终,在Terminals

  

标识符(名称,电子邮件,...)必须与[a-z_][a-z0-9_]*

匹配

正如您所看到的,无论如何都没有任何东西可以帮助您转义关键字。因此,当它在min上绊倒时,Lexer会将其识别为MIN函数(请参阅this section of the code)而不是标识符,因此错误。

简而言之,您必须依赖本机查询或使用不属于保留关键字listed here的别名。

注意:Doctrine允许您按照own quoting strategy的规定实施in this post,但问题无关紧要。在这里,你的别名的问题是它被DQL解析器匹配,这在这个位置是意外的。

答案 1 :(得分:1)

使用Mysql,您可以使用反引号`min`来转义它 使用Postgres,您可以使用双引号"min"

来转义它

您可以使用minimum之类的其他单词作为别名,以避免与数据库相关