【问题标题】:Laravel OrderBy Nested CollectionLaravel OrderBy 嵌套集合
【发布时间】:2020-04-17 22:39:23
【问题描述】:

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

以下一切正常

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();

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

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您可以像这样获得joins 的帮助:

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

    希望这会有所帮助!

    【讨论】:

    • 如果用户有多个角色怎么办?
    • @RajenderJoshi - 没找到你!
    • 一个用户只有一个角色。遗憾的是,您无法使用委托来强制执行。谢谢你的回答!
    【解决方案2】:

    您可以创建accessor,其中包含您要排序的角色ID或名称。

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

    【讨论】:

      【解决方案3】:

      这是使用集合的肮脏技巧。可能有更好的方法来实现这一点(我猜是使用 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');
      

      【讨论】:

        【解决方案4】:

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

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

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

        Official Laravel Docs on Constraining Eager Loading

        【讨论】:

          【解决方案5】:

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

          $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

          【讨论】:

            猜你喜欢
            • 2017-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-03
            • 2016-12-14
            • 1970-01-01
            • 2021-08-25
            • 2020-11-26
            相关资源
            最近更新 更多