Laravel OrderBy嵌套集合

时间:2016-12-12 12:29:16

标签: php laravel eloquent

我正在使用Roles包(类似于委托)。我正在尝试对roles.id或roles.name

上的User :: all()查询进行排序

以下是全部工作

User::with('roles');

这将返回一个Collection,其中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();

他们都没有工作。我被卡住了!有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:0)

您可以像joins这样帮助:

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

希望这有帮助!

答案 1 :(得分: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');

答案 2 :(得分:0)

您可以使accessor包含您要排序的角色ID或名称。

假设访问者名称是roleCode。然后App\User::all()->sortBy('roleCode')就可以了。

答案 3 :(得分:0)

您可以使用查询构建器对关系进行排序:

注意与您自己的示例有所不同:我没有设置roles.id,只是id

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

请参阅Official Laravel Docs on Constraining Eager Loading

答案 4 :(得分:0)

如果要基于嵌套关系列对结果进行排序,则必须使用联接链:

$values = User::query()->leftJoin('model_has_roles', function ($join) 
{
$join>on('model_has_roles.model_id', '=', 'users.id')
->where('model_has_roles.model_type', '=', 'app\Models\User');})
->leftJoin('roles', 'roles.id', '=', 'model_has_roles.role_id')
->orderBy('roles.id')->get();

请注意,如果要按多列排序,则可以根据需要添加'orderBy'子句:

->orderBy('roles.name', 'DESC')->orderby('teams.roles', 'ASC') //... ext

在这里检查我的答案: https://stackoverflow.com/a/61194625/10573560