我试图在我的查询中加入一个条件参数。如果orgID为null,我不希望查询将其用作筛选器。
AND (:orgID IS NULL OR o.id = :orgID)我正在努力做到这一点。我做错了什么?
$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();发布于 2016-01-04 05:07:45
评论部分的@Cerad和@xabbuh都是正确的。跳过附加谓词或使用QueryBuilder有条件地生成查询字符串。
在任何情况下,请记住,预准备语句占位符不能用于表名和列。
此外,从性能的角度来看,如果您知道查询将返回以前已知的结果,则不需要运行查询。这是对资源的浪费。
发布于 2016-01-21 17:34:47
我同意其他人的说法--使用QueryBuilder,因为这是Symfony / Doctrine的方式。
但是,如果您想在MySQL查询级别上解决这个问题,那么您将需要类似于"conditional WHERE子句“的东西,例如使用CASE expression。
替换
AND (:orgID IS NULL OR o.id = :orgID)使用
AND
CASE
WHEN :orgID IS NULL THEN TRUE
ELSE o.id = :orgID
END第一个条件显式地计算为TRUE,这基本上等于您的要求:“我不希望查询将其用作过滤器”。(尽管从技术上讲,这仍然是一个过滤器)。
https://stackoverflow.com/questions/34570081
复制相似问题