【问题标题】:How to get pagination links in resource collection - Laravel 5.7.19如何在资源集合中获取分页链接 - Laravel 5.7.19
【发布时间】:2019-09-05 05:09:48
【问题描述】:

我正在使用 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),
        ];
    }

结果

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

我试过$this->collection,但没有成功

请帮帮我。

【问题讨论】:

  • 您是否尝试过从您的资源中返回['data' => $this->collection]
  • 是的!它给了我 null
  • 链接因您的自定义响应而丢失。它适用于return LatestProjectsResource::collection(...);,但主键名为data 而不是items。在您的情况下是否必须将其命名为items
  • 你找到解决办法了吗?

标签: php laravel vue.js laravel-5 eloquent


【解决方案1】:

我已经通过覆盖常规资源类的 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 分页器类的实例,如果是,它只是修改底层集合并返回相同的分页器实例。您可以将其放在抽象集合类或每个资源类中。

【讨论】:

    【解决方案2】:

    为了使您的代码干净,请创建一个可跨不同集合使用的 PaginationResource,并为编辑分页详细信息创建一个位置

    然后在任何资源中添加您的分页资源,如下所示

    这是分页资源

    public function toArray($request) : Array
        {
            return [
                'total' => $this->total(),
                'count' => $this->count(),
                'per_page' => $this->perPage(),
                'current_page' => $this->currentPage(),
                'total_pages' => $this->lastPage()
            ];
        }
    

    并将其添加到任何其他类似的集合中

     public function toArray($request) : Array
        {
            $pagination = new PaginationResource($this);
    
            return [
                'templates' => $this->collection,
                $pagination::$wrap => $pagination,
            ];
        }
    
    

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 2021-12-08
      • 2019-04-25
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多