0

我有三个角色:1. Admin2. Client3.Store

我有三张桌子:1. users2. roles3.role_user

如何获取所有具有该角色的用户Client

我试过这个

$clients = User::roles()->where('App\Models\Role',Role::CLIENT)->get();

我收到以下错误。

不应静态调用非静态方法 App\Models\User::roles()

好榜样

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

用户模型

class User extends Authenticatable
{
    use Notifiable;

    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',
    ];

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

    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);
    }
}
4

2 回答 2

5

你可以用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();
于 2019-08-28T13:56:34.053 回答
3

那是因为您试图调用roles Model 类而不是实例上的方法,这应该是这样的

$clients = Role::whereName('client')->first()->users;
于 2019-08-28T13:58:12.790 回答