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

Laravel分页第二页及以上数据格式异常修复请求

Laravel自定义分页问题解决

问题现象

使用自定义集合分页宏时,对集合做where筛选后,分页返回的data变成带键名的对象格式,而非预期的数组格式。完整集合分页时正常,筛选后出现异常。

当前错误返回格式

{
    "current_page": 2,
    "data": {
        "10": {},
        "11": {}
    }
}

期望返回格式

{
    "current_page": 1,
    "data": [
        {},
        {}
    ]
}

已使用的自定义分页宏代码

在AppServiceProvider的boot方法中定义了以下集合宏:

Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') {
    $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);

    return new LengthAwarePaginator(
        $this->forPage($page, $perPage),
        $total ?: $this->count(),
        $perPage,
        $page,
        [
            'path' => LengthAwarePaginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]
    );
});

解决方案

问题出在筛选后的集合保留了原有的非连续键名,forPage返回的集合仍是关联数组结构,转JSON时会变成对象。只需在分页时将子集合转为连续索引的数组即可,修改宏代码如下:

Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') {
    $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
    // 用values()重置集合键为连续索引
    $items = $this->forPage($page, $perPage)->values();

    return new LengthAwarePaginator(
        $items,
        $total ?: $this->count(),
        $perPage,
        $page,
        [
            'path' => LengthAwarePaginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]
    );
});

原理说明

当用where筛选集合时,原集合的键名(如数据库主键ID)会被保留,此时forPage返回的集合还是带自定义键的关联集合。调用values()方法会重置集合的键为从0开始的连续整数,转JSON时就会变成数组格式,而非对象。

内容的提问来源于stack exchange,提问作者Kamaluddin Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:40:39