我正在使用Roles包(类似于委托)。我正在尝试对roles.id或roles.name
上的User :: all()查询进行排序以下是全部工作
User::with('roles');
这将返回一个Collection,其中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();
他们都没有工作。我被卡住了!有人能指出我正确的方向吗?
答案 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();
答案 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