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;
Другие вопросы по тегам