2011-03-24 83 views
3

我有一个查询:主义查询:混淆addWhere,andWhere,orWhere

$q->andWhere($q->getRootAlias().'.is_published = ?', 1); 
$q->andWhere($q->getRootAlias().'.published_at >= ?', time()); 
$q->leftJoin($q->getRootAlias().'.EventLdapGroup l'); 
$q->andWhereIn('l.ldap_group_id', $permissions_id); 
$q->orWhere('l.ldap_group_id IS NULL); 

,输出:

FROM 
    Event r LEFT JOIN r.EventLdapGroup l 
WHERE 
    r.is_published = ? AND 
    r.published_at >= ? AND 
    l.ldap_group_id IN (?, ?) OR 
    l.ldap_group_id IS NULL 

唯一的问题是,如果ldap_group_id为空(最后状态),”将删除is_publishedpublished_at条件。

我想类似的东西[要么值是ldap_group_id,或者要么是空]:

FROM 
    Event r LEFT JOIN r.EventLdapGroup l 
WHERE 
    r.is_published = ? AND 
    r.published_at >= ? AND 
    (l.ldap_group_id IN (?, ?) OR l.ldap_group_id IS NULL) 

,我必须说,我与复杂失去where条件。 如何实现这一目标?

感谢

回答

3

好的解决办法是在这里:

$q->andWhere('(l.ldap_group_id IN (' . implode(",", $permissions_id) . ') OR l.ldap_group_id IS NULL)'); 
5

而不是你的最后两行的

$q->andWhereIn('l.ldap_group_id', $permissions_id); 
$q->orWhere('l.ldap_group_id IS NULL); 

试试这个办法

$q->andWhere($qb->expr()->orx(
    $qb->expr()->in('l.ldap_group_id', $permissions_id), 
    $qb->expr()->isNull('l.ldap_group_id'); 
+0

不幸的是查询生成器不可以在Doctrine 1.2中找到:'(。Found该解决方案(见下文) – 2011-03-24 16:02:58