Symfony FosUserBundle仅显示具有角色== ROLE_USER的用户

时间:2014-08-07 16:19:31

标签: symfony orm doctrine fosuserbundle

我正在尝试仅使用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"

3 个答案:

答案 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}}