Php 如何在条令中的createQuery的where子句中使用字符串?

Php 如何在条令中的createQuery的where子句中使用字符串?,php,mysql,database,symfony,doctrine,Php,Mysql,Database,Symfony,Doctrine,我试图使用条令查询数据库中的条目数 $query = $em->createQuery('SELECT COUNT(p.id) FROM AppBundle:Product p where p.live = 1'); $count = $query->getSingleScalarResult(); 我想扩展where子句并使用“p.supplier==阿迪达斯” 如何将其添加到查询中 我可以用 findBy(数组(“live”=>1,“supplier”=>“ad

我试图使用条令查询数据库中的条目数

    $query = $em->createQuery('SELECT COUNT(p.id) FROM AppBundle:Product p where p.live = 1');
    $count = $query->getSingleScalarResult();
我想扩展where子句并使用“p.supplier==阿迪达斯”

如何将其添加到查询中

我可以用
findBy(数组(“live”=>1,“supplier”=>“adidas”)
但是我推测
findBy
比直接Mysql查询慢得多。我说得对吗?

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

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

这应该比repository
findBy()
方法更快,因为您定义的是硬编码查询,而不是让条令构建查询,也就是说,它的灵活性要低得多。如果查询的参数不需要更改,这应该没问题。您只需将多个条件括在括号内,如下所示:

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

这应该比repository
findBy()
方法更快,因为您定义的是硬编码查询,而不是让条令构建查询,也就是说,它的灵活性要低得多。如果查询的参数将无需更改理想情况下,您应该使用参数:

$query=$em->createQuery('从AppBundle:Product p中选择COUNT(p.id),其中p.live=:live和p.supplier=:supplier')
->设置参数([
“现场”=>1,
“供应商”=>“阿迪达斯”
]);

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

$query=$em->createQuery('从AppBundle:Product p中选择COUNT(p.id),其中p.live=:live和p.supplier=:supplier')
->设置参数([
“现场”=>1,
“供应商”=>“阿迪达斯”
]);

findBy的区别与这是一个直接查询(不是,仍然是DQL)这一事实无关。计数的执行速度比集合检索快。可能重复?使用DQL时,请确保整个查询是双引号的,查询中的字符串是单引号的。DQL不能在查询中使用双引号字符串。与findBy的区别与这是一个直接查询(不是,仍然是DQL)这一事实无关。计数的执行速度比集合检索快。可能重复?使用DQL时,请确保整个查询是双引号的,查询中的字符串是单引号的。DQL不会在查询中使用双引号字符串。这是一个更好的答案,不要硬编码或在查询字符串中插入参数,使用参数这是一个更好的方法,对于动态查询来说,这是一个正确清理/转义用户提供的参数并防止sql插入的方法,但如果参数是静态的、安全的,为什么要增加调用其他方法的成本?真的要增加成本吗?我们这里说的是纳秒。。。将查询逻辑与参数(静态或非静态)分离会更加清晰。另外,不要忘记,每个查询都可以缓存为每个查询结果。始终选择进化代码而不是硬编码代码。语言级的速度优化从来不是良好软件体系结构的良好标志。在应用程序运行、正常工作、没有bug并且已经赚钱之前,这永远不应该是开发人员的问题。这是一个更好的答案,不要硬编码或在查询字符串中插入参数,使用参数这是一个更好的方法,对于动态查询来说,它可以正确地清理/转义用户提供的参数,并防止sql注入,但是,如果参数是静态的、安全的、数据的,为什么要增加调用其他方法的成本呢?真的是额外的成本吗?我们这里说的是纳秒。。。将查询逻辑与参数(静态或非静态)分离会更加清晰。另外,不要忘记,每个查询都可以缓存为每个查询结果。始终选择进化代码而不是硬编码代码。语言级的速度优化从来不是良好软件体系结构的良好标志。在应用程序运行、正常工作、没有bug并且已经赚钱之前,这永远不应该是开发人员关心的问题。