funfelfonfafis
funfelfonfafis

Reputation: 187

Laravel. Sort by user role, relations

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

Answers (4)

AddWeb Solution Pvt Ltd
AddWeb Solution Pvt Ltd

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

chanafdo
chanafdo

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

LorenzoBerti
LorenzoBerti

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

Naresh Kumar
Naresh Kumar

Reputation: 1061

Try this one

 $users = User::with(['roles' => function($query) {
            $query->whereNotNull('name')
                   ->where(['name'=>'Admin']);
        }])->get();

Upvotes: 1

Related Questions