自定义Laravel Collection丢失分页元数据的问题如何解决?
问题原因
paginate() 返回的是分页器实例 LengthAwarePaginator,并非直接返回模型集合。你在分页器上直接调用自定义集合的 applyPrice() 方法时,Laravel会通过魔术方法转发请求到分页器持有的内部集合,而你当前 applyPrice() 方法返回的是转换后的集合对象,你用这个返回值覆盖了原本的分页器变量,就导致分页元数据全部丢失。
修复方法
调整控制器调用逻辑即可,不需要修改自定义集合的代码:
- 先获取分页器实例
- 通过分页器的
getCollection()方法拿到内部的自定义集合,调用applyPrice()方法,因为transform()是直接修改集合本身的操作,不需要接收返回值 - 最后将完整的分页器实例传给资源返回
修改后的控制器代码:
public function index() { $user = auth()->user(); $products = Product::orderBy("name")->paginate(); // 直接修改分页器内部的集合,不覆盖分页器本身 $products->getCollection()->applyPrice($healthcenter); return HealthcenterProductResource::collection($products); }
另外注意你applyPrice()方法里存在变量名笔误:$$stockPrice 属于变量写法错误,$productsStockPrice 也没有定义传入,需要你自行修正变量逻辑。
修复后返回的结果就会自动带上 total、current_page、last_page 等所有分页元数据。
内容的提问来源于stack exchange,提问作者Toto NaBendo
相关产品推荐
相关产品推荐

