Reputation: 657
I'm working in this Laravel project which has this structure
users: id | first_name |...
roles: id | name
assigned_roles: id | user_id | role_id
I think this is quite obvious :p
User model
class User extends ConfideUser {
use HasRole;
public function Roles(){
return $this->belongsToMany('Role','assigned_roles');
}
Role model
class Role extends EntrustRole
{
public function Users()
{
return $this->belongsToMany('User','assigned_roles');
}
}
I'm looking for a way to get all users with a specified role in this case 'Teacher'. I've tried this:
$students = User::with(array('Roles' => function($query) {
$query->where('name','Teacher');
}))
->get();
return $students;
but this always returns an array of all users.
would anyone know why that's so? Thanks!
Upvotes: 19
Views: 65540
Reputation: 1302
This would work exactly as intended:
$users = User::whereHas('roles' => function($q){$q->where('name', 'Teacher');})->get();
Upvotes: 0
Reputation: 308
If you are using spatie/laravel-permission or backpack/permissionmanager you can simply do:
$teachers = User::role('Teacher')->get();
Upvotes: 8
Reputation: 79
If You Are using laravel-permission package then,
In Controller,
$rolesWithUserCount = Role::withCount('users')->get();
In Blade File,
@foreach ($rolesWithUserCount as $item)
{{ $item->name }}
{{$item->users_count }}
@endforeach
OutPut:
Role1 Role1Count
Role2 Role2Count
....
For More: VISIT: https://laravel.com/docs/7.x/eloquent-relationships#counting-related-models
Upvotes: 0
Reputation: 3044
In case you want to get all users with a list of potentials roles:
$authorizedRoles = ['Teacher', 'Professor', 'Super professor'];
$users = User::whereHas('roles', static function ($query) use ($authorizedRoles) {
return $query->whereIn('name', $authorizedRoles);
})->get();
Upvotes: 5
Reputation: 299
Try This.
Role::where('rolename', 'user')->first()->users()->get()
Upvotes: 3
Reputation: 8577
What you're currently asking laravel for in your $students
query, is 'give me all the students, and for each student get me all of their roles if the role is teacher'
Try using the whereHas
$students = User::whereHas(
'roles', function($q){
$q->where('name', 'Teacher');
}
)->get();
This should get you the users, but only where they have a role where the name is teacher.
Upvotes: 47