You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:05:30