Paginate JSON массив в Laravel - PullRequest
0 голосов
/ 01 мая 2018

Я сейчас использую 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); Также не работает.

Я думаю, что упускаю первый шаг к тому, как это сделать, но, честно говоря, я потерян. Я не совсем уверен, как это сделать. У Google есть несколько примеров того, как это сделать, когда вы используете модель Eloquent для извлечения данных из базы данных. Также показано, как это сделать, когда вы запрашиваете базу данных, но ничего. Документация Laravel, найденная под 5.6 нумерацией страниц Разбиение результатов в Query Builder Разбитые красноречивые результаты

Создание пагинатора вручную очень ограничен и говорит только использовать paginator или lengthAwarePginator и использовать array_slice.

Может ли кто-нибудь указать мне правильное направление, как этого достичь?

1 Ответ

0 голосов
/ 02 мая 2018

Полагаю, вы пытаетесь разбить обычный старый массив PHP на Laravel.
Функция paginate предназначена только для построителей запросов, поэтому она не работает для массивов. Чтобы делать то, что вы хотите, сначала нужно узнать, на какой странице пользователь просматривает. Обычно текущая страница передается через параметр page GET, но LengthAwarePaginator от Laravel предлагает функциональность для ее извлечения. Для этого вам понадобится use.

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

Затем вам нужно slice массив, содержащий результат. Установите переменную $perPage соответственно. Тогда вам либо нужно:

  1. чтобы превратить ваш массив в Collection и slice это

    $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 по-прежнему (нарезанный) Collection или array, поэтому давайте создадим экземпляр paginator.

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

$orders_to_show - теперь вы хотите получить нумерацию страниц. Вы должны иметь возможность использовать его так же, как вы обрабатываете нумерованные результаты из своей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...