【问题标题】:How to use strings in the where clause of createQuery in Doctrine?如何在 Doctrine 的 createQuery 的 where 子句中使用字符串?
【发布时间】:2019-08-30 01:52:40
【问题描述】:

我正在尝试使用 Doctrine 从数据库中查询条目数。

    $query = $em->createQuery('SELECT COUNT(p.id) FROM AppBundle:Product p where p.live = 1');
    $count = $query->getSingleScalarResult();

我想扩展 where 子句并使用“p.supplier == adidas”。

如何将其添加到查询中?

我可以使用 findBy(array("live" => 1, "supplier" => "adidas")) 但我推测 findBy 比直接 Mysql 查询要慢得多。我说的对吗?

【问题讨论】:

  • 与 findBy 的区别与这是直接查询(不是,仍然是 DQL)这一事实无关。计数的执行速度比集合检索快。
  • 使用 DQL 时,请确保您的整个查询是双引号,并且查询中的字符串是单引号。 DQL 不适用于查询中的双引号字符串。

标签: php mysql database symfony doctrine


【解决方案1】:

理想情况下,您应该使用参数:

$query = $em->createQuery('SELECT COUNT(p.id) FROM AppBundle:Product p WHERE p.live = :live AND p.supplier = :supplier')
    ->setParameters([
        'live' => 1,
        'supplier' => 'adidas'
    ]);

【讨论】:

  • 这是一个更好的答案,不要在查询字符串中硬编码或注入参数,使用参数
  • 是的,这是一种更好的方法,因为动态查询可以正确清理/转义用户提供的参数并防止 sql 注入,但如果参数是静态的、安全的、基准的,为什么还要增加调用其他方法的成本?
  • 真的要额外付费吗?我们在这里谈论的是纳秒......将查询逻辑与参数分开更清晰,无论是否静态。
  • 另外不要忘记,每个查询都可以作为每个查询结果进行缓存。始终选择演化代码而不是硬编码代码。语言级别的速度优化从来都不是好的软件架构的好兆头。在应用程序运行、正常工作、没有错误并且已经赚钱之前,这绝不应该是开发人员关心的问题。
【解决方案2】:

您只需将多个条件括在括号内,如下所示:

$query = $em->createQuery("SELECT COUNT(p.id) FROM AppBundle:Product p WHERE (p.live = 1 AND p.supplier = 'adidas')");

这应该比存储库findBy() 方法更快,因为您定义的是硬编码查询,而不是让学说构建查询,也就是说,它也不太灵活。这应该没问题如果查询的参数永远不需要更改

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2021-12-29
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多