首页 > 解决方案 > 如何在资源集合中获取分页链接 - Laravel 5.7.19

问题描述

我正在使用 laravel API 资源。当我们不使用任何资源集合时,我们会使用 paginate(10) 获得分页链接等。但是当我使用 Resource::collection 时,我什么也得不到,只有我放入资源的字段。

这是我的控制器

return response()->json([
  "items" => LatestProjectsResource::collection(Project::has('pages')->where('type', $type)->latest()->paginate(20))
]);

这是我的资源

public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->name,
            'slug' => $this->slug,
            'url' => $this->url,
            'thumbnail' => new ThumbnailResource($this->thumbnail),
        ];
    }

结果

在此处输入图像描述

我尝试了一些来自在线社区的答案,包括这个Customizing Laravel 5.5 Api Resource Collection pagination one 但它不起作用

我试过$this->collection但没有运气

请帮帮我。

标签: phplaravelvue.jslaravel-5eloquent

解决方案


我通过覆盖常规资源类的collection 方法解决了这个问题。

public static function collection($data)
{
    /* is_a() makes sure that you don't just match AbstractPaginator
     * instances but also match anything that extends that class.
     */
    if (is_a($data, \Illuminate\Pagination\AbstractPaginator::class)) {
        $data->setCollection(
            $data->getCollection()->map(function ($listing) {
                return new static($listing);
            })
        );

        return $data;
    }

    return parent::collection($data);
}

这只是检查给定数据是否是 Laravel 分页器类的实例,如果是,它只是修改底层集合并返回相同的分页器实例。您可以将其放在抽象集合类或每个资源类中。


推荐阅读