Doctrine 2使用一组选项搜索数组字段

时间:2016-08-17 14:29:14

标签: symfony doctrine-orm

我有以下查询:

$roles = array();
        $roles[] = 'ROLE_SUPER_ADMIN';
        $roles[] = 'ROLE_ADMIN';
        $roles[] = 'ROLE_TRUSTEE';
        $roles[] = 'ROLE_MODERATOR';    

        $qb = $this->createQueryBuilder('u')
                    ->select('u')
                    ->where('u.username is not null')
                    ->andWhere('u.roles IN (:roles)')
                    ->setParameter('roles', $roles);

        return $qb->getQuery()->getResult();

哪个有效。但这不是我所追求的。 u.roles是一个数组字段,可以包含任意数量的'角色。我需要查询该字段以查看它是否包含$ roles定义的数组中列出的任何角色。基本上相反:

->andWhere('(:roles) IN u.roles')

但这会引发错误。

我接近这一切都错了吗?

2 个答案:

答案 0 :(得分:2)

这是一个更好的版本

$roles = array();
        $roles[] = 'ROLE_SUPER_ADMIN';
        $roles[] = 'ROLE_ADMIN';
        $roles[] = 'ROLE_TRUSTEE';
        $roles[] = 'ROLE_MODERATOR'; 

        $ar = new ArrayCollection();
        $qb = $this->createQueryBuilder('u');
            $qb ->select('u');
        foreach($roles as $role){
            $qb->andWhere('u.roles LIKE :roles')
                ->setParameter('roles', '%"'.$role.'"%');          
        }
        $results = $qb->getQuery()->getResult();
        foreach ($results as $result){
            $ar[] = $result;
        }

        return $ar;

答案 1 :(得分:0)

我会尝试内爆数组 到字符串并在查询中使用此字符串

$implodedRoles = implode(',', $roles);

$qb = $this->createQueryBuilder('u')
                ->select('u')
                ->where('u.username is not null')
                ->andWhere('u.roles IN (:roles)')
                ->setParameter('roles', $implodedRoles);