如何根据用户在Laravel 5中的角色选择用户?

时间:2017-10-17 20:01:02

标签: php laravel laravel-5

从我的控制器中我想选择所有具有角色"客户端"的用户。

我有一个用户模型和一个角色模型。角色属于许多用户,用户属于许多角色。

我已经建立了我的模型并在模型实例级别有一些辅助函数来获取角色和用户

以下是用户和角色数据库模型:

应用/ user.php的

ChangeCollection

应用/ Role.php:

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    // User belongs to many roles
    public function roles()
    {
        return $this->belongsToMany('App\Role')->withTimestamps();
    }

    // whitelist specific roles
    // reject if user does not have given roles
    public function authorizeRoles($roles)
    {
        if ($this->hasAnyRole($roles)) {
            return true;
        }

        abort(401, 'This action is unauthorized.');
    }

    // Check if a user has a role
    public function hasRole($role)
    {
      if ($this->roles()->where('name', $role)->first())
      {
        return true;
      }

      return false;
    }

    // Pass in string or array to check if the user has a role
    public function hasAnyRole($roles)
    {
      if (is_array($roles)) {
        foreach ($roles as $role) {
          if ($this->hasRole($role)) {
            return true;
          }
        }
      } else {
        if ($this->hasRole($roles)) {
          return true;
        }
      }
      return false;
    }
}

我有 create_users_table create_roles_table 的迁移以及 create_role_user_table 的数据透视表。每个角色都有一个id,名称和描述。每个用户都有一个ID,姓名,电子邮件和密码。

我想过滤所有具有"客户端"的角色的用户。

在我的控制器方法中,我尝试调用角色,但它不起作用,因为它是一个实例方法:

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User')->withTimestamps();
    }
}

如何仅使用具有名称"客户"

的角色的用户填充// Display admin dashboard public function admin(Request $request) { // check to make sure user is an admin $request->user()->authorizeRoles('admin'); // Display all users that have the role "client" // ***** section that does not work ******** $users = User::all()->roles()->where('name', 'client')->get(); return view('admin', compact('users')); } 变量?

1 个答案:

答案 0 :(得分:7)

使用whereHas()方法:

User::whereHas('roles', function ($q) use ($roleName) {
    $q->where('name', $roleName);
})->get();