如何在dql中搜索实体的数组?

时间:2013-07-29 04:02:04

标签: php symfony dql

我正在尝试过滤掉具有超级管理员角色的管理员。为什么以下不起作用?

public function findAdmins()
{
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb
        ->select('a')
        ->from('MyBundle:Admin', 'a')
        ->where($qb->expr()->notIn('ROLE_SUPER_ADMIN', 'a.roles'));

    $result = $qb->getQuery()->execute();

    return $result;
}

它会给我以下错误:

[Syntax Error] line 0, col 68: Error: Expected Literal, got 'a' 

DQL查询如下所示:

SELECT a FROM MyBundle:Admin a WHERE ROLE_SUPER_ADMIN NOT IN(a.roles)  

角色本身不是一个实体。它只是一个字符串数组。

$roles = array('ROLE_ADMIN', 'ROLE_SUPER_ADMIN)'

2 个答案:

答案 0 :(得分:2)

尝试使用MEMBER OF运算符

$qb
->select('a')
->from('MyBundle:Admin', 'a')
->where(':role NOT MEMBER OF ad.roles')->setParamete('role', 'ROLE_SUPER_ADMIN');

<强>更新 找到的唯一解决方案是使用LIKE检查db中的序列化字符串。 Details here

答案 1 :(得分:0)

请勿将column nametable name

混在一起

试试这个,

$qb
    ->select('a')
    ->from('MyBundle:Admin', 'ad')
    ->where($qb->expr()->notIn('ROLE_SUPER_ADMIN', 'ad.roles'));

应该是,

SELECT a FROM MyBundle:Admin ad WHERE ROLE_SUPER_ADMIN NOT IN(ad.roles)