我有以下查询:
$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')
但这会引发错误。
我接近这一切都错了吗?
答案 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);