2017-10-17 5 views
3

Depuis mon contrôleur, je voudrais sélectionner tous les utilisateurs qui ont le rôle "client".Comment sélectionner les utilisateurs en fonction du rôle qu'ils ont dans Laravel 5?

J'ai un modèle d'utilisateur et un modèle de rôle. Un rôle appartient à plusieurs utilisateurs et un utilisateur appartient à plusieurs rôles.

J'ai créé mes modèles et ont des fonctions d'aide au niveau de l'instance de modèle pour aller chercher les rôles et les utilisateurs

Voici les modèles de l'utilisateur et la base de données Rôle:

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

J'ai migrations pour un create_users_table, create_roles_table et un tableau croisé dynamique pour create_role_user_table. Chaque rôle a un identifiant, un nom et une description. Chaque utilisateur a un identifiant, un nom, un email et un mot de passe.

Je voudrais filtrer par tous les utilisateurs qui ont le rôle appelé "client".

Dans ma méthode du contrôleur j'essaie d'appeler des rôles mais il ne fonctionne pas parce qu'il est une méthode d'instance:

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

} 

Comment puis-je remplir la variable $users avec uniquement les utilisateurs qui ont le rôle avec le nom « client "?

+0

Essayez d'aller l'autre sens. Obtenir tous les rôles où le nom est client, puis obtenir tous les utilisateurs qui correspondent. – aynber

+0

Vous pouvez également consulter les documents de Laravel à propos de [querying relations] (https://laravel.com/docs/master/eloquent-relationships#querying-relations), voir si l'une de ces méthodes fonctionne pour vous. – aynber

Répondre

4

Utilisez la méthode whereHas():

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

fonctionne très bien. Définissez '$ roleName = 'client';' ou la fonction remplie comme 'function ($ q) {$ q-> where ('nom', '=', 'client'); } 'Merci! –