Reputation: 187
I want to sort the users by role and I would like the user to have another role disappear.
Controller
$users = User::with(['roles' => function($query) {
$query->where('name','=','Admin');
}])->get();
View
@foreach($users as $user)
<tr>
<td>{{$user->id}}</td>
<td>{{$user->name}}</td>
<td>{{$user->email}}</td>
<td>
@foreach ($user->roles as $role)
{{$role->name}}
@endforeach
</td>
</tr>
@endforeach
It does not pass the role, but displays the user data. I only want user data from the Admin
role. I don't want to display John Doe
.
Thx for help.
Upvotes: 1
Views: 948
Reputation: 21681
You can try:
$users = User::User::with('roles')->whereHas('roles', function($query) {
$query->where('name','Admin');
}])->get();
OR you can try fluent way like:
Controller
$users = DB::table('users')
->select('users.id as Id','users.name as userName','users.email as email','roles.name as roleName')
->join('roles','roles.user_id','=','users.id')
->where('roles.name','=','admin')
->get();
View
@foreach($users as $user)
<tr>
<td>{{$user->Id}}</td>
<td>{{$user->userName}}</td>
<td>{{$user->email}}</td>
<td>{{$user->roleName}}</td>
</tr>
@endforeach
Upvotes: 0
Reputation: 5124
You can filter by relation using whereHas
Try the following
$users = User::with('roles')->whereHas('roles', function($query) {
$query->where('name', 'Admin');
})->get();
Upvotes: 3
Reputation: 6974
Have you try with:
$users = User::whereHas('roles', function($query) {
$query->where('name','=','Admin');
}])->get()->sortByDesc('roles.name');
You can find the explanation of sortBy or sortByDesc in https://laravel.com/docs/5.4/collections#method-sortbydesc
Upvotes: 1
Reputation: 1061
Try this one
$users = User::with(['roles' => function($query) {
$query->whereNotNull('name')
->where(['name'=>'Admin']);
}])->get();
Upvotes: 1