Запрос доктрины: сбивает с толку 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_published и published_at.

Я хочу что-то подобное [либо значения находятся в ldap_group_id, либо это значение 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)

И я должен сказать, что я потерялся в сложном состоянии. Как этого добиться?

Спасибо


person sf_tristanb    schedule 24.03.2011    source источник


Ответы (2)


Вместо ваших последних двух строк

$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' );
person bw_üezi    schedule 24.03.2011
comment
К сожалению, конструктор запросов недоступен в Doctrine 1.2 :'(. Решение найдено (см. ниже) - person sf_tristanb; 24.03.2011

Хорошо, решение здесь:

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