ResourceCollection不包括分页链接

时间:2018-03-14 23:47:17

标签: laravel laravel-5.5

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))];
}

响应

"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"
            }
        ]
    }

当使用::collection方法甚至ResourceCollection的资源作为数组的一部分返回时,会发生这种情况。

如果我们要删除数组并返回纯集合:

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

一切都会正常运作,响应将包括链接

为什么API资源(使用collection方法或ResourceCollection)在数组中返回时不包含分页信息?

4 个答案:

答案 0 :(得分:2)

我遇到此问题并找到了解决方案,请检查以下链接以获取解决方案的详细说明

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

简而言之,请检查以下解决该问题的代码段

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

答案 1 :(得分:1)

我注意到资源收集的结果必须单独返回才能正常工作

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

它完美无缺,但

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

不包含分页链接

答案 2 :(得分:0)

我已在本地检查过,是的,你是对的,它不会返回元和链接。所以我有一个有效的解决方案。创建一个Post资源。并为您的帖子提供资源控制器。然后在您需要评论的单个帖子api上,只需明确地返回您的评论。

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

所以显示的控制器代码意味着单个帖子将是这样的:

public function show($id)
{
  return new PostsResource(Post::find($id));
}

答案 3 :(得分:0)

您需要set pagination link

public function toArray($request)
{
    return [
        'data' => $this->collection,
        'links' => [
            'self' => 'link-value',
        ],
    ];
}