【问题标题】:Use reserved keyword as alias in doctrine query builder在学说查询生成器中使用保留关键字作为别名
【发布时间】:2018-02-16 10:32:29
【问题描述】:
$em->createQueryBuilder()
->select("MIN(m.price) AS min")
->addSelect('MAX(m.price) AS max')
->from('AppBundle:Sites', 'm');`

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

我尝试了单引号和反引号,但都没有成功。

【问题讨论】:

  • 你的数据库管理系统是什么?
  • 这是 Postgres @goto
  • 更新了我的答案,似乎是转义 postgres 关键字的双引号。你能确认一下吗?

标签: doctrine-orm


【解决方案1】:

您将无法使用 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 允许您按照in this post 的讨论实现您的own quoting strategy,但问题无关。在这里,您的别名的问题在于它被 DQL 解析器作为函数匹配,这在该位置是意外的。

【讨论】:

    【解决方案2】:

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

    您可以使用另一个词,例如 minimum 作为别名,以避免依赖于数据库

    【讨论】:

    • 不幸的是,它也不起作用,我想我会选择minimum
    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多