Laravel: Как получить всех пользователей, которые играют определенную роль?
У меня три роли: 1. Admin
2. Client
3. Store
У меня есть три таблицы: 1. users
2. roles
3.role_user
Как я могу получить всех пользователей, которые имеют роль Client
?
Я пробовал это
$clients = User::roles()->where('App\Models\Role',Role::CLIENT)->get();
Но я получаю следующую ошибку:Non-static method App\Models\User::roles() should not be called statically
Вот мой Role
модель
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public const ADMIN = 'Admin';
public const CLIENT = 'Client';
public const STORE = 'Store';
public function users()
{
return $this->belongsToMany('App\Models\User')->using('App\Models\UserRole');
}
}
Вот мой User Model
<?php
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'first_name',
'last_name',
'email',
'password',
'activated',
'token',
'signup_ip_address',
'signup_confirmation_ip_address',
'signup_sm_ip_address',
'admin_ip_address',
'updated_ip_address',
'deleted_ip_address',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function hasRole(String $roleName)
{
return $this->roles()->where('name', $roleName)->exists();
}
public function roles()
{
return $this->belongsToMany('App\Models\Role');
}
public function addRole(String $roleName)
{
$role = Role::where('name', $roleName)->first();
if ($role) $this->roles()->save($role);
}
}
2 ответа
Решение
Вы можете сделать это с whereHas()
метод. это способ обусловить отношения, используя exists
в запросе
$clients = User::whereHas('roles', function($role) {
$role->where('name', '=', Role::CLIENT);
})->get();
Если вы хотите получить роль тоже, сложите with()
метод
$clients = User::whereHas('roles', function($role) {
$role->where('name', '=', Role::CLIENT);
})->with(['roles' => function($role) {
$role->where('name', '=', Role::CLIENT);
}])->get();
Это потому, что вы пытаетесь позвонить roles
метод класса Model, а не экземпляр, вот как это должно быть
$clients = Role::whereName('client')->first()->users;