【问题标题】:Escaping backslash in namespaces with DQL (Doctrine 2)使用 DQL 转义命名空间中的反斜杠(准则 2)
【发布时间】:2011-08-13 01:27:15
【问题描述】:

我对用 DQL 编写查询有点困惑。 来自官方文档:

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.age > 20');

为什么命名空间的反斜杠没有转义?
由于这个原因,我在 Zend Studio 中收到了警告,但它仍然有效,但我认为这只是“运气”,因为 \M 和 \U 都不是有效的转义序列。

你怎么看?使用该语法是否安全?还是最好在 DQL 中始终避开“\”?

$query = $em->createQuery('SELECT u FROM MyProject\\Model\\User u WHERE u.age > 20');

【问题讨论】:

    标签: namespaces doctrine doctrine-orm dql backslash


    【解决方案1】:

    Dynamic namespace names (quoted identifiers) should escape backslash

    看起来第一个语法很幸运。 :) 我自己没试过,所以如果你说带转义的查询和不带转义的查询一样,最好使用转义查询。

    【讨论】:

    • 顺便说一句,我已经检查了我项目中的一些工作代码......即使在双引号字符串中也可以使用单反斜杠。使其崩溃的唯一方法是在某个字符之前在双引号字符串中使用单个 \,它与 \ 一起形成一个转义序列。
    • 是的,Doctrine 的文档确实是错误的,我的意思是,他们的示例工作正常,但这只是因为他们使用大写作为他们的名字(因此你不能形成一个转义序列)但是最佳实践是为了逃避反斜杠,感谢链接约翰!
    【解决方案2】:

    说得好,但 DQL 在将解析后的查询发送到数据库引擎之前会先查询并匹配命名空间和类。

    MyProject\Model\User 被缩减为在 User 类中指定的表名。

    SELECT u FROM MyProject\Model\User u WHERE u.age > 20 变为

    SELECT u FROM user[即用户类中指定的表名] u WHERE u.age > 20

    【讨论】:

    • 是的,我知道我们的DQL不是最终查询,而是“createQuery”接收一个字符串,而字符串在任何地方都是字符串,字符串中的反斜杠是特殊字符。实际上,我不明白那些 DQL(字符串)如何在不转义反斜杠的情况下工作。如果我们有一个像 \new\Table 这样的命名空间会发生什么?字符串“\n”中的内容不被解释为新行吗?如果您在 DQL 中转义反斜杠,您不会收到任何警告,当然,查询会按预期工作。我认为这是“正确”的方式,但我不明白为什么没有人在 DQL 中转义反斜杠。
    猜你喜欢
    • 2015-11-19
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多