我有一个问题:
$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)
而且我必须说,我已经失去了复杂的条件。 如何实现?
谢谢
答案 0 :(得分: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' );
答案 1 :(得分:3)
好的解决方案在这里:
$q->andWhere('(l.ldap_group_id IN ( ' . implode(",", $permissions_id) . ') OR l.ldap_group_id IS NULL )' );