我试图在我的查询中添加一个条件参数。如果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();
答案 0 :(得分:1)
评论部分的@Cerad
和@xabbuh
都是正确的。要么跳过附加谓词,要么使用QueryBuilder
来有条件地创建查询字符串。
在任何情况下,请记住预准备语句占位符不能用于表名和列。
此外,从性能角度来看,如果您知道它将返回先前已知的结果,则无需运行查询。这只是浪费资源。
答案 1 :(得分:1)
我同意其他人所说的 - 使用QueryBuilder
,因为这是Symfony / Doctrine方式。
但是如果你想在MySQL查询级别解决它,那么你将需要类似"条件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,这基本上等于您的要求:"我不希望查询将其用作过滤器"。 (虽然从技术上讲,这仍然是一个过滤器)。