Laravel 9实现带分页的订单列表遇报错,求解决方案
Laravel 9 集合分页报错解决方法
问题根源
你遇到的Method Illuminate\Support\Collection::paginate does not exist或Method Illuminate\Support\Collection::links does not exist报错,本质是**Illuminate\Support\Collection类本身没有paginate和links方法**——这两个方法属于Laravel的查询构建器(QueryBuilder/Eloquent Builder)或分页器实例,而非普通集合。
你的原始代码先循环查询合并成集合,再尝试调用分页方法,自然会报错。下面提供两种解决方案,优先推荐方案一(性能更优)。
方案一:重构查询,直接用查询构建器分页(推荐)
避免多次查询数据库合并集合,直接从数据库层面筛选符合条件的订单,原生支持分页:
方式1:多条件组合筛选
// 获取符合条件的site_id + order_status_id组合 $statusConditions = SitesOrderStatus::where('internal_status_id', 2) ->select('site_id', 'order_status_id') ->get(); // 直接查询符合所有组合的订单并分页 $orders = SitesOrders::where(function ($query) use ($statusConditions) { foreach ($statusConditions as $condition) { $query->orWhere(function ($q) use ($condition) { $q->where('site_id', $condition->site_id) ->where('order_status_id', $condition->order_status_id); }); } })->orderByDesc('date_added') ->paginate($data['paginate']); $data['orders'] = $orders;
方式2:关联表查询(更高效)
通过whereExists关联SitesOrderStatus表,直接筛选符合条件的订单:
use Illuminate\Support\Facades\DB; $orders = SitesOrders::whereExists(function ($query) { $query->select(DB::raw(1)) ->from('sites_order_statuses') // 替换为你的SitesOrderStatus表名 ->whereColumn('sites_order_statuses.site_id', 'sites_orders.site_id') ->whereColumn('sites_order_statuses.order_status_id', 'sites_orders.order_status_id') ->where('sites_order_statuses.internal_status_id', 2); })->orderByDesc('date_added') ->paginate($data['paginate']); $data['orders'] = $orders;
方案二:手动创建分页器处理集合
如果必须基于已有的集合分页,可使用LengthAwarePaginator手动构建分页实例:
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Request; // 保留你原有的集合合并逻辑 $orders = collect([]); foreach ($dbOrderStatusArray as $item) { $orders = $orders->concat(SitesOrders::where('site_id', $item['site_id']) ->where('order_status_id', $item['order_status_id']) ->get()); } // 排序并重置集合键名 $sortedOrders = $orders->sortByDesc('date_added')->values(); // 分页参数配置 $perPage = $data['paginate']; $currentPage = Request::get('page', 1); // 从请求获取当前页码,默认第1页 $offset = ($currentPage - 1) * $perPage; // 切片获取当前页数据 $currentPageOrders = $sortedOrders->slice($offset, $perPage)->values(); // 创建分页实例 $paginate = new LengthAwarePaginator( $currentPageOrders, $sortedOrders->count(), // 总数据量 $perPage, $currentPage, [ 'path' => Request::url(), // 分页链接的基础URL 'pageName' => 'page', // 页码参数名 ] ); $data['orders'] = $paginate;
内容的提问来源于stack exchange,提问作者Speakeroc
相关产品推荐
相关产品推荐

