Пагинация при возврате массива Api объекта ресурса - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно отправить несколько объектов на ресурсы API. Поэтому я возвращаю несколько объектов в массиве. Все работает нормально, но не отображает метаданные пагинации. как Current_page, next_page url и т. д.

return [                  
            'across_city' => ServiceProviderCollection::collection($across_city),
            'near_by' => ServiceProviderCollection::collection($near_by)
          ];

Мой ресурс

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;

    class ServiceProviderCollection extends  Resource
    {

        public function toArray($request)
        { 

            return
            [  

                'name'=>$this->forename,
                'rating'=>$this->rating,
                'price'=>$this->price,
                'distance'=>round($this->distances,1),

            ];
        }
    }

Мой контроллер: здесь у меня есть два типа пользователей. пользователи near_by и пользователи по всему городу. Я отправил их в ServiceProviderCollection в виде массива.

$user_city = $userObj->location->city;
$locationObj = Location::whereNotIn('id', $blockeduser)->where('city',$user_city)->first();
$across_city = $locationObj->users()->simplePaginate(20);

    $near_by =  User::join('locations as l', 'users.location_id', '=', 'l.id')
        ->select('users.*', DB::raw('(6371 * acos(cos(radians(' . $coordinates['latitude'] . ')) * cos(radians(`lat`)) * cos(radians(`lng`) - radians(' . $coordinates['longitude'] . ')) + sin(radians(' . $coordinates['latitude'] . ')) * sin(radians(`lat`)))) as distances'))
        ->having('distances', '<', $max_distance)
        ->orderBy('distances', 'ASC')
        ->where('role_id',2)
        ->whereNotIn('id', $blockeduser)
        ->simplePaginate(20);

    return [
                'across_city' => ServiceProviderCollection::collection($across_city),
                'near_by' => ServiceProviderCollection::collection($near_by)
           ];

Я хочу Json Data с нумерацией страниц.

{"data":{
    "across_city": [
        {
            "name": "??",
            "rating": 0,
            "price": 0,
            "distance": 0,

        }
    ],
 "links": {
        "first": "",
        "last": "",
        "prev": null,
        "next": ""
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 3,
        "path": "",
        "per_page": 2,
        "to": 2,
        "total": 6
    },
{
    "near_by": [
        {
            "name": "??",
            "rating": 0,
            "price": 0,
            "distance": 0,

        }
    ],
 "links": {
        "first": "",
        "last": "",
        "prev": null,
        "next": ""
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 3,
        "path": "",
        "per_page": 2,
        "to": 2,
        "total": 6
    }
}

1 Ответ

0 голосов
/ 10 сентября 2018

Понятия не имею, какова цель ServiceProviderCollection. Если он создает обычную коллекцию, то есть лучший способ сделать это .

Чтобы иметь возможность разбивать на страницы простую коллекцию, вам нужно добавить эту вспомогательную функцию к вашей базе:

function paginateCollection($items, $perPage = 15, $page = null, $options = [])
{
    $page = $page ?: (\Illuminate\Pagination\Paginator::resolveCurrentPage() ?: 1);
    $items = $items instanceof \Illuminate\Support\Collection ? $items : \Illuminate\Support\Collection::make($items);
    return new \Illuminate\Pagination\LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options);
}

С помощью этой функции вы можете сделать

return [                  
    'across_city' => paginateCollection(collect($across_city), 20),
    'near_by' => paginateCollection(collect($near_by), 20)
];

Редактировать

Созданы ли у вас соответствующие коллекции ресурсов?
Вот так: php artisan make:resource Cities --collection

Если это так, вы можете вернуть разбитую на страницы коллекцию ресурсов

...