Doctrine createQuery()条件参数

时间:2016-01-02 19:54:36

标签: doctrine-orm symfony

我试图在我的查询中添加一个条件参数。如果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();

2 个答案:

答案 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,这基本上等于您的要求:"我不希望查询将其用作过滤器"。 (虽然从技术上讲,这仍然是一个过滤器)。