原则查询:混淆addWhere,Where或Where

|| 我有一个查询:
$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)
而且我必须说,我迷失在复杂的条件下。 如何实现呢? 谢谢     
已邀请:
代替最后两行
$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\' );
    
好的解决方案在这里:
$q->andWhere(\'(l.ldap_group_id IN ( \' . implode(\",\", $permissions_id) . \') OR l.ldap_group_id IS NULL )\' );
    

要回复问题请先登录注册