2016-12-12 3 views
0

Я использую пакет ролей (аналогично доверенности). Я пытаюсь сортировать мой пользователь :: все() запрос на roles.id или roles.nameLaravel OrderBy Вложенная коллекция

Ниже все работает

User::with('roles'); 

Это возвращает коллекцию, с соотношением ролей, которые также являются коллекция .. Как это:

enter image description here

Я пытаюсь получить всех пользователей, но упорядоченный по их роли ID.

Я попытался следующие без успеха может быть, потому, что возвращается «ролей» коллекцию? И не первая роль?

return App\User::with(['roles' => function($query) { 
    $query->orderBy('roles.id', 'asc'); 
}])->get(); 

И это

return App\User::with('roles')->orderBy('roles.id','DESC')->get(); 

Ни один из них не работают. Я застрял! Может кто-нибудь указать мне в правильном направлении, пожалуйста?

ответ

0

Вы можете воспользоваться помощью joins, как это:

App\User::join('roles', 'users.role_id', '=', 'roles.id') 
     ->orderBy('roles.id', 'desc') 
     ->get(); 

Надеется, что это помогает!

+2

Что делать, если пользователь имеет несколько ролей? –

+0

@ RajenderJoshi - Не понял! –

+0

Пользователь будет иметь только 1 роль. Позор, вы не можете принудить их использовать доверенность. спасибо за Ваш ответ! – Notflip

0

Вот трюк с использованием коллекций. Возможно, лучший способ добиться этого (используя, по-моему, класс Paginator). Это решение, безусловно, является катастрофой для огромных таблиц.

$roles = Role::with('users')->orderBy('id', 'DESC')->get(); 
$sortedByRoleId = collect(); 

$roles->each(function ($role) use($sorted) { 
    $sortedByRoleId->push($role->users); 
}); 
$sortedByRoleId = $sortedByRoleId->flatten()->keyBy('id'); 
0

Вы можете сделать accessor, который содержит идентификатор роли или имя, которое вы хотите сортировать.

Предположим, что имя аксессора является roleCode. Тогда будет работать App\User::all()->sortBy('roleCode').

0

Вы можете сортировать ваши отношения с помощью конструктора запросов:

уведомления разницы с вашим собственным примером: Я не ставлю roles.id но только id

$users = App\User::with(['roles' => function ($query) { 
    $query->orderBy('id', 'desc'); 
}])->get(); 

См Official Laravel Docs on Constraining Eager Loading