如何根据用户在 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_table、create_roles_table 和 create_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 中的角色选择用户?的主要内容,如果未能解决你的问题,请参考以下文章