【问题标题】:How to use transform in paginated collection in laravel如何在 laravel 的分页集合中使用变换
【发布时间】:2020-01-12 00:47:10
【问题描述】:

我想在 laravel 5.5 的分页集合中使用 map 或 transform,但我正在努力工作

这是我试图做的,但 getCollectionLengthAwarePaginator 中不可用,就像我们在以前的 laravel 版本中所做的那样,请参阅:How to transform paginated collection

 $query = User::filter($request->all()
        ->with('applications');

    $users = $query->paginate(config('app.defaults.pageSize'))
        ->transform(function ($user, $key) {
            $user['picture'] = $user->avatar;

            return $user;
        });

这是我收到的,但我的结果中没有分页详细信息

如何返回带有分页详细信息的转换后的集合?

【问题讨论】:

    标签: laravel eloquent laravel-collection laravel-pagination


    【解决方案1】:

    您的问题是您正在打印 $users 变量,该变量保存当前页面中的用户数组。要获取分页列表,请尝试返回/打印 $query

    所以你的代码应该如下:

        $query = User::filter($request->all()
                ->with('applications');
        
            $users = $query->paginate(config('app.defaults.pageSize'))
                ->transform(function ($user, $key) {
                    $user['picture'] = $user->avatar;
        
                    return $user;
                });
    return response()->json($query);
    

    编码愉快!

    【讨论】:

      【解决方案2】:

      对于 Laraval >= 8.x:如果您想对分页查询生成器结果的集合执行transform(),而不是对完整集合执行分页,可以使用方法through()

      User::filter($request->all()
         ->with('applications')
         ->paginate(config('app.defaults.pageSize'))
         // through() will call transform() on the $items in the pagination object
         ->through(function ($user, $key) {
            $user['picture'] = $user->avatar;
      
            return $user;
         });
      
      

      【讨论】:

        【解决方案3】:

        我最终在AppServiceProvider 中构建了自定义分页功能

        use Illuminate\Support\Collection;

        registerAppServiceProvider

         Collection::macro('paginate', function ($perPage, $total = null, $page = null, $pageName = 'page') {
                $page = $page ?: \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPage($pageName);
                return new \Illuminate\Pagination\LengthAwarePaginator(
                    $this->forPage($page, $perPage),
                    $total ?: $this->count(),
                    $perPage,
                    $page,
                    [
                        'path' => \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPath(),
                        'pageName' => $pageName,
                    ]
                );
            });
        

        【讨论】:

          【解决方案4】:

          您应该在检索集合和转换之前进行分页,如下所示:

          $query = User::filter($request->all())->with('applications')->paginate(50);
          
          $users = $query->getCollection()->transform(function ($user, $key) {
              //your code here
          });
          
          dd($users);
          

          它应该会给你想要的结果。

          【讨论】:

          • 我已经尝试过了,但是 getCollection 在 laravel 5.5 中不可用,所以它对我不起作用它返回与我的结果上图相同的结果没有分页详细信息
          猜你喜欢
          • 1970-01-01
          • 2019-04-14
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 2021-04-18
          • 2015-09-30
          相关资源
          最近更新 更多