首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规则createQuery()条件参数

规则createQuery()条件参数
EN

Stack Overflow用户
提问于 2016-01-03 03:54:36
回答 2查看 610关注 0票数 1

我试图在我的查询中加入一个条件参数。如果orgID为null,我不希望查询将其用作筛选器。

代码语言:javascript
复制
 AND (:orgID IS NULL OR o.id = :orgID)

我正在努力做到这一点。我做错了什么?

代码语言:javascript
复制
$em = $this->getEntityManager();
$query = $em->createQuery('
    select count(d.id) 
    from \***\OrganizationBundle\Entity\Organization o 
    inner join \***\OrganizationBundle\Entity\Facility f
    inner join \***\OrganizationBundle\Entity\Department d  
    where d.active = true
    AND f.active = true
    AND o.active = true
    AND d.name LIKE :name
    AND (:orgID IS NULL OR o.id = :orgID)                
');
$query->setParameter(':name', '%' . $name . '%');
$query->setParameter(':orgID', $orgID);
$count = $query->getSingleScalarResult();
EN

回答 2

Stack Overflow用户

发布于 2016-01-04 05:07:45

评论部分的@Cerad@xabbuh都是正确的。跳过附加谓词或使用QueryBuilder有条件地生成查询字符串。

在任何情况下,请记住,预准备语句占位符不能用于表名和列。

此外,从性能的角度来看,如果您知道查询将返回以前已知的结果,则不需要运行查询。这是对资源的浪费。

票数 1
EN

Stack Overflow用户

发布于 2016-01-21 17:34:47

我同意其他人的说法--使用QueryBuilder,因为这是Symfony / Doctrine的方式。

但是,如果您想在MySQL查询级别上解决这个问题,那么您将需要类似于"conditional WHERE子句“的东西,例如使用CASE expression

替换

代码语言:javascript
复制
AND (:orgID IS NULL OR o.id = :orgID)

使用

代码语言:javascript
复制
AND
    CASE
        WHEN :orgID IS NULL THEN TRUE
        ELSE o.id = :orgID
    END

第一个条件显式地计算为TRUE,这基本上等于您的要求:“我不希望查询将其用作过滤器”。(尽管从技术上讲,这仍然是一个过滤器)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34570081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档