如何在 laravel 的分页集合中使用变换

Posted

技术标签:

【中文标题】如何在 laravel 的分页集合中使用变换【英文标题】:How to use transform in paginated collection in 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;
        );

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

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

【问题讨论】:

【参考方案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 中不可用,所以它对我不起作用它返回与我的结果上图相同的结果没有分页详细信息

以上是关于如何在 laravel 的分页集合中使用变换的主要内容,如果未能解决你的问题,请参考以下文章

附加到 Laravel 中的分页链接 URL

如何使用 Hibernate 解决错误“失败,因为启用了'在集合获取上的分页失败'已启用”?

如何在swift 3中的表视图单元格中实现集合视图的分页?

如何维护引导选项卡上的分页?

laravel 4 分页集合

Laravel 5 |设置 ID 字段的分页问题