2016-08-17 6 views
1

の配列と配列フィールドを検索する私は、次のクエリを持っている:ドクトリン2オプション

$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は配列フィールドであり、任意の数の '役割'を含むことができます。そのフィールドに$ roleで定義された配列にリストされているいずれかのロールが含まれているかどうかを調べる必要があります。基本的に逆:

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

しかし、これはエラーを投げます。

私はこれにすべて間違っていますか?

答えて

0

クエリでこの文字列を使用しようとするだろう。しかし、私の解決策は効率的ではないことは絶対に確信しています(しかしそれは機能します)。より効率的なソリューションがあれば、それを聞いてみたいです。

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

     $ar = new ArrayCollection(); 

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

     return $ar; 
0

私は文字列に配列 を内破し、私は自分の質問にお答えします

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

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

お返事ありがとうございます。残念ながら、私はそれを試しても動作しません。 u.rolesが文字列に展開され、IN文を使って検索する必要があると私には思えますが、それは間違っているかもしれません。他のアイデア? – Patrick

関連する問題