我正在尝试仅使用ROLE_USER
的用户。
我在控制器中有这个:
$query = $this->getDoctrine()->getEntityManager()
->createQuery(
'SELECT u FROM StageUserBundle:User u WHERE u.roles LIKE :role'
)->setParameter('role', '%"ROLE_USER"%'
);
$users = $query->getResult();
它与ROLE_ADMIN
而不是ROLE_USER
一起使用,但我只需要显示User.getRoles()== "ROLE_USER"
。
答案 0 :(得分:5)
您的问题是FOSUserBundle中的用户模型实际上从未实际拥有ROLE_USER
。
FOS \ UserBundle \模型\的UserInterface
const ROLE_DEFAULT = 'ROLE_USER';
FOS \ UserBundle \模型\用户
public function addRole($role)
{
$role = strtoupper($role);
if ($role === static::ROLE_DEFAULT) {
return $this;
}
if (!in_array($role, $this->roles, true)) {
$this->roles[] = $role;
}
return $this;
}
....
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
// we need to make sure to have at least one role
$roles[] = static::ROLE_DEFAULT;
return array_unique($roles);
}
当您getRoles
时,它会将ROLE_USER
添加为默认值,当您addRole
时,它会检查该角色是否为ROLE_USER
,然后会跳过该角色。< / p>
实际上,系统中的每个用户都会拥有ROLE_USER
,因此要查找具有该角色的所有用户,您只需执行SELECT u FROM StageUserBundle:User u
。
答案 1 :(得分:4)
我找到了解决问题的方法。 我在我的控制器中改变了这个:
$query = $this->getDoctrine()->getEntityManager()
->createQuery('SELECT u FROM StageUserBundle:User u WHERE NOT u.roles LIKE :role'
)->setParameter('role', '%"ROLE_ADMIN"%' );
$users = $query->getResult();
希望这会有所帮助。
答案 2 :(得分:0)
我不是SQL大师,但我认为这种情况很难,因为roles
字段是json
类型
你可以试试这个
$query = $this->getDoctrine()->getEntityManager()
->createQuery(
'SELECT u FROM StageUserBundle:User u
WHERE u.roles LIKE :role
AND NOT u.roles LIKE :role2'
)->setParameter('role', '%"ROLE_USER"%'
)->setParameter('role2', '%ADMIN%'
);
$users = $query->getResult();
它会查找包含roles
而不是"ROLE_USER"
的{{1}}