首页 > 解决方案 > 在laravel中对json数组进行分页

问题描述

我目前正在使用 Laravel 5.6,我有一个 api 的结果。我正在尝试对结果进行分页,但我无法做到。

我的 json 结果是这样的:

{#922 ▼
  +"orders": array:50 [▼
    0 => {#220 ▶}
    1 => {#234 ▶}
    2 => {#250 ▶}
    3 => {#263 ▶}
    4 => {#274 ▶}
    5 => {#297 ▶}
    6 => {#310 ▶}
    7 => {#322 ▶}
    8 => {#338 ▶}
    9 => {#351 ▶}
  ]
}

然后我得到订单并像这样放入一个变量中:$orders = $call->orders;

我试过这个:

$orders = $shopifyData->paginate(20)->toArray();

我收到此错误:调用数组上的成员函数 paginate()

我也试过这个: $orders::Paginate(20); 也不起作用。

我想我错过了如何做到这一点的第一步,但老实说我迷路了。我真的不知道该怎么做。当你使用 Eloquent 模型从数据库中检索数据时,谷歌上有几个例子说明了如何做到这一点。它还显示了当您查询数据库但什么都没有时如何执行此操作。在 5.6 分页下找到的 laravel 文档:Paginating Query Builder Results Paginating Eloquent Results

手动创建 Paginator 非常有限,只说使用 paginator 或 lengthAwarePginator 并使用 array_slice。

有人可以指出我如何实现这一目标的正确方向吗?

标签: laravel-5

解决方案


我假设您正在尝试以 Laravel 的方式对一个普通的 PHP 数组进行分页。
paginate函数仅适用于查询构建器,因此不适用于数组。要做你想做的事,你首先需要知道用户在哪个页面查看。通常,当前页面是通过pageGET 参数传递的,但 LaravelLengthAwarePaginator提供了提取该参数的功能。你需要一个use才能工作。

use Illuminate\Pagination\LengthAwarePaginator; // don't forget to add this
....
$current_page = LengthAwarePaginator::resolveCurrentPage();

然后你需要slice包含结果的数组。相应地设置$perPage变量。那么你要么需要:

  1. 把你的数组变成一个Collectionslice

    $orders = $call->orders;
    $orders_collection = new Collection($orders); // needs a use statement
    $orders_collection = collect($orders); // alternative. You can use helper function
    $current_page_orders = $orders_collection->slice(($current_page - 1) * $perPage, $perPage)->all(); // slice($offset, $number_of_item)
    
  2. array_slice直接用于您的阵列。

    $orders = $call->orders;
    $current_page_orders = array_slice($orders, ($current_page - 1) * $perPage, $perPage);
    

$current_page_orders仍然是 (sliced) Collectionor array,所以让我们创建一个分页器实例。

$orders_to_show = new LengthAwarePaginator($current_page_orders, count($orders_collection), $perPage);

$orders_to_show现在是您想要的分页结果。您应该能够像处理数据库中的分页结果一样使用它。


推荐阅读