Laravel报错:Collection::appends方法不存在的原因排查
问题原因及解决思路
报错根本原因
你在控制器中调用sortBy()方法后,原本的分页实例(LengthAwarePaginator)被转换成了普通的Eloquent集合(Collection),而Collection类并没有appends()方法,所以视图里调用$products->appends()时就会抛出BadMethodCallException异常。
具体过程拆解
Product::whereIn('id', $product_ids)->published()->paginate(12)返回的是Illuminate\Pagination\LengthAwarePaginator对象,这个类自带appends()、links()等分页相关方法,此时直接传给视图调用是没问题的。- 但你后续调用了
sortBy()方法,这个方法是Collection类的方法,调用后会返回一个新的Illuminate\Database\Eloquent\Collection实例,不再是分页对象,自然没有appends()方法。
正确的解决方式
不要在分页之后做内存排序,应该把排序逻辑放到数据库查询阶段,使用orderBy()代替sortBy(),这样分页时就已经完成排序,返回的依然是分页实例:
// 控制器中修改为 $products = Product::whereIn('id', $product_ids) ->published() ->orderBy('price', 'asc') // 直接在数据库层面排序 ->paginate(12);
这样传给视图的$products还是分页对象,就能正常调用appends()->links()了。
内容的提问来源于stack exchange,提问作者Артем Дорош</think_never_used_51bce0c785ca2f68081bfa7d91973934>
相关产品推荐
相关产品推荐

