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

Posted

技术标签:

【中文标题】如何根据用户在 Laravel 5 中的角色选择用户?【英文标题】:How to select users based on the role that they have in Laravel 5? 【发布时间】:2018-03-29 15:00:15 【问题描述】:

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

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

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

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

app/User.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;
    

app/Role.php:

class Role extends Model

    public function users()
    
        return $this->belongsToMany('App\User')->withTimestamps();
    

我有 create_users_tablecreate_roles_tablecreate_role_user_table 数据透视表的迁移。每个角色都有一个 ID、名称和描述。每个用户都有一个 ID、姓名、电子邮件和密码。

我想按具有“客户”角色的所有用户进行过滤。

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

// 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'));


如何仅使用具有名称为“client”的角色的用户填充$users 变量?

【问题讨论】:

换个方向试试。获取名称为客户端的所有角色,然后获取所有匹配的用户。 你也可以查看 Laravel 的关于 querying relations 的文档,看看那里有没有适合你的方法。 【参考方案1】:

使用whereHas()方法:

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

【讨论】:

效果很好。设置$roleName = 'client'; 或填充函数为function ($q) $q->where('name', '=', 'client'); 谢谢!

以上是关于如何根据用户在 Laravel 5 中的角色选择用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 laravel 5.6 中的角色保护用户管理区域?

在 Laravel 5.5 中根据用户角色应用全局范围

laravel 5根据用户的角色在登录后重定向用户

Laravel Print 根据用户的权限选择选项

根据用户的角色和状态登录laravel

如何在注册期间为用户分配角色? (委托)(Laravel 5.1)