Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

ahoi's avatar
Level 5

Pagination on API Ressource

Hi everybody,

I wrote a little API Ressource for my User's model:

use Illuminate\Http\Resources\Json\ResourceCollection;

class User extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        return [
            'data' => $this->collection->transform(function ($user) {
                return [
                    'id'         => $user->id,
                    'name'       => $user->name,
                    'email'      => $user->email,
                    'aboutme'    => $user->aboutme,
                    'homepage'   => $user->homepage,
                    'twitter'    => $user->twitter,
                    'created_at' => $user->created_at,
                    'updated_at' => $user->updated_at,
                    'avatar'     => $user->getAvatar(),
                ];
            }),
        ];
        
    }
}

Now I'm trying to fetch my items in my ApiController:

 /**
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function getList(Request $request)
    {
        $data =  new UserResourceCollection(User::paginate(1));
        return response()->json($data);
    }

So - actually I'm just getting this:

{
  "data": [
    {
      "id": 1,
      "name": "John Doe",
      "email": "[email protected]",
      "aboutme": "Test",
      "homepage": "http://example.org",
      "twitter": "@example",
      "created_at": {
        "date": "2018-08-20 11:36:25.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "updated_at": {
        "date": "2018-10-26 19:47:40.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "avatar": {
        "id": 73,
        "model_type": "App\User",
        "model_id": "1",
        "collection_name": "user_images",
        "name": "Bild",
        "file_name": "Bild.jpg",
        "mime_type": "image/jpeg",
        "disk": "public",
        "size": "70250",
        "manipulations": [],
        "custom_properties": {
          "custom_headers": [],
          "generated_conversions": {
            "preview": true,
            "thumb": true,
            "header": true
          },
          "default_avatar": true
        },
        "responsive_images": {
          "preview": {
            "urls": [
              "Bild___preview_600_540.jpg",
              "Bild___preview_501_450.jpg",
              "Bild___preview_419_377.jpg",
              "Bild___preview_351_315.jpg",
              "Bild___preview_293_263.jpg"
            ],
          },
          "header": {
            "urls": [
              "Bild___header_1800_1200.jpg",
              "Bild___header_1505_1003.jpg",
              "Bild___header_1260_840.jpg",
              "Bild___header_1054_702.jpg",
              "Bild___header_881_587.jpg",
              "Bild___header_737_491.jpg",
              "Bild___header_617_411.jpg",
              "Bild___header_516_344.jpg",
              "Bild___header_432_288.jpg"
            ]
          }
        },
        "order_column": "10",
        "created_at": "2018-10-11 14:49:14",
        "updated_at": "2018-10-21 16:05:31"
      }
    }
  ]
}

Well - all my pagination information is gone :-(

If I do this:

 /**
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function getList(Request $request)
    {
        $data =  new UserResourceCollection(User::paginate());

        return response()->json($data);
    }

I'm getting both users:

{
  "data": [
    {
      "id": 1,
      "name": "John Doe",
      "email": "[email protected]",
      "aboutme": "Test",
      "homepage": "http://example.org",
      "twitter": "@example",
      "created_at": {
        "date": "2018-08-20 11:36:25.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "updated_at": {
        "date": "2018-10-26 19:47:40.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "avatar": {
        "id": 73,
        "model_type": "App\User",
        "model_id": "1",
        "collection_name": "user_images",
        "name": "Bild",
        "file_name": "Bild.jpg",
        "mime_type": "image/jpeg",
        "disk": "public",
        "size": "70250",
        "manipulations": [],
        "custom_properties": {
          "custom_headers": [],
          "generated_conversions": {
            "preview": true,
            "thumb": true,
            "header": true
          },
          "default_avatar": true
        },
        "responsive_images": {
          "preview": {
            "urls": [
              "Bild___preview_600_540.jpg",
              "Bild___preview_501_450.jpg",
              "Bild___preview_419_377.jpg",
              "Bild___preview_351_315.jpg",
              "Bild___preview_293_263.jpg"
            ]
          },
          "header": {
            "urls": [
              "Bild___header_1800_1200.jpg",
              "Bild___header_1505_1003.jpg",
              "Bild___header_1260_840.jpg",
              "Bild___header_1054_702.jpg",
              "Bild___header_881_587.jpg",
              "Bild___header_737_491.jpg",
              "Bild___header_617_411.jpg",
              "Bild___header_516_344.jpg",
              "Bild___header_432_288.jpg"
            ]
          }
        },
        "order_column": "10",
        "created_at": "2018-10-11 14:49:14",
        "updated_at": "2018-10-21 16:05:31"
      }
    },
    {
      "id": 2,
      "name": "Jonnie Donnie",
      "email": "[email protected]",
      "aboutme": "<p>It's a me</p>",
      "homepage": "https://example.wtf",
      "twitter": "@example2",
      "created_at": {
        "date": "2018-09-25 08:23:18.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "updated_at": {
        "date": "2018-10-30 07:18:48.000000",
        "timezone_type": 3,
        "timezone": "UTC"
      },
      "avatar": {
        "id": 40,
        "model_type": "App\User",
        "model_id": "2",
        "collection_name": "user_images",
        "name": "16427620_1962599807213714_791945067670209719_n",
        "file_name": "16427620_1962599807213714_791945067670209719_n.jpg",
        "mime_type": "image/jpeg",
        "disk": "public",
        "size": "15466",
        "manipulations": [],
        "custom_properties": {
          "custom_headers": [],
          "generated_conversions": {
            "preview": true,
            "thumb": true,
            "header": true
          },
          "default_avatar": true,
          "default_header": true
        },
        "responsive_images": {
          "preview": {
            "urls": [
              "16427620_1962599807213714_791945067670209719_n___preview_600_540.jpg",
              "16427620_1962599807213714_791945067670209719_n___preview_501_450.jpg",
              "16427620_1962599807213714_791945067670209719_n___preview_420_378.jpg",
              "16427620_1962599807213714_791945067670209719_n___preview_351_315.jpg",
              "16427620_1962599807213714_791945067670209719_n___preview_294_264.jpg",
              "16427620_1962599807213714_791945067670209719_n___preview_245_220.jpg"
            ]
          },
          "header": {
            "urls": [
              "16427620_1962599807213714_791945067670209719_n___header_1800_1200.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_1505_1003.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_1260_840.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_1054_702.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_881_587.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_737_491.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_617_411.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_516_344.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_432_288.jpg",
              "16427620_1962599807213714_791945067670209719_n___header_361_240.jpg"
            ]
          }
        },
        "order_column": "3",
        "created_at": "2018-09-25 08:23:50",
        "updated_at": "2018-10-30 18:06:49"
      }
    }
  ]
}

But still without pagination data?

What am I doing wrong?

0 likes
1 reply
ahoi's avatar
ahoi
OP
Best Answer
Level 5

I think I solved it this way:

I added

            'pagination' => $this->resource->toArray()

to my array.

Please or to participate in this conversation.