让所有用户在Laravel中扮演角色

vri*_*aam 4 php roles laravel eloquent laravel-4

我在这个具有这种结构的Laravel项目中工作

用户:id | first_name | ...

角色:id | 名称

assigned_roles:id | user_id | ROLE_ID

我认为这很明显:p

用户模型

class User extends ConfideUser {
use HasRole;

public function Roles(){
    return $this->belongsToMany('Role','assigned_roles');
}
Run Code Online (Sandbox Code Playgroud)

榜样

class Role extends EntrustRole
{
public function Users()
{
    return $this->belongsToMany('User','assigned_roles');
}


} 
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来让所有具有指定角色的用户在这种情况下"教师".我试过这个:

$students = User::with(array('Roles' => function($query) {
        $query->where('name','Teacher');
    }))
    ->get();
    return $students;
Run Code Online (Sandbox Code Playgroud)

但这总是返回所有用户的数组.

有人会知道为什么会这样吗?谢谢!

due*_*lsy 18

你目前在$students查询中要求laravel的是"给我所有的学生,并且如果这个角色是老师,每个学生都会得到我所有的角色"

尝试使用 whereHas

$students = User::whereHas(
    'roles', function($q){
        $q->where('name', 'Teacher');
    }
)->get();
Run Code Online (Sandbox Code Playgroud)

这应该可以让您获得用户,但只能在他们拥有名称为教师的角色的位置.


Qui*_*cia 8

如果您使用spatie/laravel-permissionBackpack/permissionmanager,您可以简单地执行以下操作:

$teachers = User::role('Teacher')->get();
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您想让所有用户获得潜在角色列表:

$authorizedRoles = ['Teacher', 'Professor', 'Super professor'];

$users = User::whereHas('roles', static function ($query) use ($authorizedRoles) {
                    return $query->whereIn('name', $authorizedRoles);
                })->get();
Run Code Online (Sandbox Code Playgroud)