繁体   English   中英

Laravel OrderBy 嵌套集合

[英]Laravel OrderBy Nested Collection

我正在使用一个角色包(类似于委托)。 我正在尝试对我的 User::all() 查询进行排序 role.id 或 roles.name

以下是所有工作

User::with('roles');

这将返回一个集合,具有也是一个集合的角色关系.. 像这样:

在此处输入图片说明

我正在尝试获取所有用户,但按其角色 ID 排序。

我尝试了以下但没有成功可能是因为“角色”返回了一个集合? 而不是第一个角色?

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

和这个

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

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

您可以像这样借助joins

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

希望这可以帮助!

这是使用集合的肮脏技巧。 可能有更好的方法来实现这一点(我猜是使用分页器类)。 这个解决方案对于大表来说绝对是一场灾难。

$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');

您可以访问您希望通过排序包含角色ID或名称。

假设访问者名称是 roleCode。 然后App\\User::all()->sortBy('roleCode')将起作用。

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

请注意与您自己的示例的不同之处:我没有设置roles.id而只是id

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

请参阅Laravel 官方文档,了解限制急切加载

如果要根据嵌套关系列对结果进行排序,则必须使用连接链:

$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM