mysql - 当 null 时,如何让带有 where not 子句的 Doctrine 查询生成器返回值

标签 mysql symfony doctrine-orm doctrine query-builder

根据 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 的任何用户?

非常感谢!

最佳答案

您需要组合 ORAND 语句:

/**
 * @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/

相关文章:

mysql - 在 SQL 中显示完整日期的月份

mysql - 如何比较两列以在 MySQL 中查找不匹配的记录

php - 使用 JMSI18nRoutingBundle 时如何禁用所有包的所有路由的国际化?

php - 如何恢复根节点

php - Symfony 错误 - EntityManager#persist() 期望参数 1 是一个实体对象,数组给定

mysql - 这两个查询中 "IS NOT NULL"和 "NOT (field = NULL)"之间的区别

php - 根据值连接列名

mysql - 在 Symfony 2.5 和 Doctrine 查询生成器中使用圆括号 ( > )

php - sonata admin + a2lix + gedmo 可翻译问题

php - 如何在 Symfony 中设置数据转换器以重用现有实体?