Laravel中如何使用pagination与sortByDesc?分页报错求助
解决Laravel分页调用
sortByDesc后丢失links()方法的问题 嘿,我来帮你搞定这个问题!你遇到的Method Illuminate\Database\Eloquent\Collection::links does not exist错误,其实是个很常见的小坑,原因很明确:
问题根源
Demmande::paginate(10)返回的是**LengthAwarePaginator分页实例**,这个类自带分页相关的方法(比如你视图里用到的links())- 但你紧接着调用
sortByDesc('created_at')之后,这个分页实例会被转换成普通的Eloquent Collection集合,而集合类根本没有links()方法,所以视图渲染时就报错了
正确的解决方式
别在分页之后做排序,而是把排序逻辑放到数据库查询阶段,用orderBy代替sortByDesc。这样排序和分页都会在数据库层面执行,返回的依然是完整的分页实例,完美保留分页功能:
public function ViewDemmandes(){ // 把排序逻辑整合到查询构建器中,先排序再分页 $listdemmande = Demmande::orderBy('created_at', 'desc')->paginate(10); $listvillee = Ville::all(); $listcategorie = Categorie::all(); // 其实不用额外赋值变量,直接compact传递原变量更简洁 return view("demmande.demmandes", compact('listvillee', 'listcategorie', 'listdemmande')); }
为什么sortByDesc不行?
sortByDesc是Collection的内存排序方法,它只会把当前分页的10条数据在PHP内存里排序,不仅效率不如数据库层面的orderBy,还会直接破坏分页实例的结构,导致丢失links()这类分页专属方法。而orderBy是让数据库先排序数据再分页,既高效又能保留分页功能。
小优化建议
你代码里的$villes = $listvillee;这类变量重新赋值完全没必要,直接把查询出来的变量传递给视图就好,能让代码更简洁清爽~
内容的提问来源于stack exchange,提问作者Zakaria Mountassir
相关产品推荐
相关产品推荐

