如何在Laravel的Resource中输出关联Collection的分页链接
Laravel Resource 关联集合分页链接输出实现方案
问题原因
你给ItemCollection传入的是paginate()方法返回的LengthAwarePaginator分页实例,但是你重写了集合类的toArray方法,仅返回了自定义映射后的列表数据,分页实例自带的分页元数据(包含上下页链接、总页数、当前页码等)被直接丢弃,所以拿不到分页链接。
具体实现步骤
1. 修改ItemCollection类,补充分页元数据
你可以直接在toArray方法中同时返回自定义的列表数据和分页信息,修改后的代码如下:
public function toArray($request) { return [ // 你原来的自定义列表数据,放到data字段下 'data' => $this->collection->map(function ($item) { return [ "id" => $item->id , "name" => $item->name , "slug" => $item->slug , "image" => imageGenerate("items" , $item->image) , "code" => $item->code , "category" => $item->category->name??"" ]; }), // 分页基础信息 'current_page' => $this->currentPage(), 'last_page' => $this->lastPage(), 'per_page' => $this->perPage(), 'total' => $this->total(), // 分页链接 'links' => [ 'prev_page_url' => $this->previousPageUrl(), 'next_page_url' => $this->nextPageUrl(), 'first_page_url' => $this->url(1), 'last_page_url' => $this->url($this->lastPage()) ] ]; }
2. (可选)优化分页参数,避免冲突
如果你的主资源本身也做了分页,默认的page请求参数会同时作用于主资源和关联的items分页,导致页码异常。你可以给关联分页单独设置参数名,修改你的Resource类代码如下:
public function toArray($request) { return [ "name" => $this->name , "slug" => $this->slug , "bg_image" => imageGenerate("sections" , $this->bg_image) , "bg_color" => $this->bg_color , // 第三个参数指定关联分页的参数名为items_page,不会和主分页的page参数冲突 "items" => new ItemCollection($this->items()->paginate(20, ['*'], 'items_page')) , ]; }
最终返回效果
修改后接口返回的items字段会包含data(列表内容)、links(分页链接)、分页参数三类信息,你需要的上下页链接就在items.links字段下。
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

