8

CommentsCollection

class CommentsCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return [
            'data' => $this->collection
        ];
    }
}

CommentsController

public function index()
{
    $post = Post::find(1);
    return ['post'=> $post, 'comments' => new CommentsCollection(Comment::paginate(1))];
}

Response

"comments": {
        "data": [
            {
                "id": 1,
                "content": "First comment",
                "post_id": 6,
                "account_id": 1,
                "created_at": "2018-03-07 02:50:33",
                "updated_at": "2018-03-07 02:50:34"
            }
        ]
    }

This happens when resource with use of ::collection method or even ResourceCollection returned as a part of the array.

If we're going to remove array and return pure collection:

return new CommentsCollection(Comment::paginate(1))

everything is going to work fine and response will include meta and links.

Why does API Resource (using collection method or ResourceCollection) doesn't include pagination information when returned in array?

Src
  • 5,252
  • 5
  • 28
  • 56

3 Answers3

7

i have encountered this problem and found a solution check the following link for a detailed description of the solution

https://laracasts.com/discuss/channels/laravel/paginate-while-returning-array-of-api-resource-objects-to-the-resource-collection?reply=575401

in short check the following code snippet that solve the problem

$data = SampleModel::paginate(10);
return ['key' => SampleModelResource::collection($data)->response()->getData(true)];
Mahmoud
  • 71
  • 1
  • 1
3

I notice result of resource collection must return individually to work correctly

return ItemMiniResource::collection(
        $items->paginate(10)
    );

It's works perfectly, but

$data['items'] = ItemMiniResource::collection(
        $items->paginate(10)
    );
return $data

not include paginate links

Mahdi Majidzadeh
  • 798
  • 1
  • 14
  • 27
0

I have checked it locally and yes you are right it don't return the meta and links. So I have a solution which is working. Create a Post resource. And a resouce controller for your posts. Then on the single post api where you need comments, just return your comments explicitly.

class PostsResource extends Resource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'body' => $this->body,
            'comments' => Comment::paginate(5)
        ];
    }
}

So your controller code for the show which means the single post will be like this:

public function show($id)
{
  return new PostsResource(Post::find($id));
}
Haider Ali
  • 1,081
  • 8
  • 23