2013-07-29 48 views
2

我想過濾出超級管理員角色的管理員。爲什麼以下不起作用?如何在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)' 
+0

是'a.roles'你正在加入的一個集合? – prodigitalson

回答

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

+0

這是給我下面的錯誤: [語義錯誤] 0行,列65附近「角色':錯誤:PathExpression無效。必須是CollectionValuedAssociationField。 – apfz

+0

看看這個問題http://stackoverflow.com/questions/9016914/symfony-2-fos-bundle-how-to-select-users-with-a-specific-role –

+0

好!解決它! – apfz

0

不要table name

混合column 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) 
+0

同樣的錯誤出現: [語法錯誤] 0行,列62:錯誤:預期文字,得到了「廣告」 – apfz