[英]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();
如果要根据嵌套关系列对结果进行排序,则必须使用连接链:
$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.