根据 Doctrine 2,我有以下查询:
/**
* @param Organization $organization
* @param User $user
* @return \Doctrine\ORM\QueryBuilder
*/
public function getFindByOrganizationQueryBuilder(Organization $organization, User $user)
{
$builder = $this
->createQueryBuilder('u')
->leftJoin('u.roles', 'r')
->where($this->createQueryBuilder('u')->expr()->orX(
$this->createQueryBuilder('u')->expr()->notIn('r.role', array('ROLE_SUPER_ADMIN', 'ROLE_ADMIN')),
$this->createQueryBuilder('u')->expr()->isNull('r')
))
;
return $builder;
}
这不会按预期工作,并返回至少具有一个与 ROLE_ADMIN 或 ROLE_SUPER_ADMIN 不同的角色的用户
或者,我尝试将 where 子句替换为
->where('r.role <> 'ROLE_ADMIN')
->andWhere('r.role <> 'ROLE_SUPER_ADMIN')
然后它不会返回没有角色的用户。
如何更改查询,以便它返回没有 ROLE_ADMIN 或 ROLE_SUPER_ADMIN 的任何用户?
非常感谢!
最佳答案
您需要组合 OR
和 AND
语句:
/**
* @param Organization $organization
* @param User $user
* @return \Doctrine\ORM\QueryBuilder
*/
public function getFindByOrganizationQueryBuilder(Organization $organization, User $user)
{
$builder = $this->createQueryBuilder('u');
$builder
->leftJoin('u.roles', 'r')
->where($builder->expr()->orX(
$builder->expr()->andX(
$builder->expr()->neq('r.role', 'ROLE_SUPER_ADMIN'),
$builder->expr()->neq('r.role', 'ROLE_ADMIN')
),
$builder->expr()->isNull('r')
))
;
return $builder;
}
关于mysql - 当 null 时,如何让带有 where not 子句的 Doctrine 查询生成器返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185415/