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

Laravel API中分页page查询参数被忽略问题咨询

问题分析与解决

核心问题

分页无效的根源有两个:

  • 缓存Key未区分页码:当前缓存Key仅关联语言环境,没有加入页码标识,导致所有分页请求都命中同一缓存,返回的始终是第一次缓存的第一页数据。
  • 路由参数设置冗余冲突:路由把page设为URL路径参数,但控制器方法未接收该参数,且Laravel分页默认读取URL查询参数(?page=X),两者冲突导致分页参数未被正确识别。

修复方案

1. 修正缓存Key,加入页码区分

修改控制器代码,将当前请求的页码加入缓存Key,确保不同页码的缓存相互独立:

public function list() {
    $page = request()->get('page', 1); // 获取当前页码,默认值为1
    return Cache::remember('list_albums_'.App::getLocale().'_page_'.$page, 60, function () {
        return Album::with(['group', 'event', 'event.translation'])
            ->orderBy('id', 'desc')
            ->simplePaginate(12);
    });
}

2. 调整路由配置(二选一)

方案A:使用默认查询参数(推荐)

Laravel分页原生支持?page=X格式的查询参数,无需在路由中定义路径参数,修改路由为:

Route::get('/albums', 'AlbumController@list');

方案B:保留路径参数(需配合控制器接收参数)

如果坚持使用/albums/{page}的路径格式,需要在控制器中接收参数并传递给分页方法:

// 控制器方法
public function list($page = 1) {
    return Cache::remember('list_albums_'.App::getLocale().'_page_'.$page, 60, function () use ($page) {
        return Album::with(['group', 'event', 'event.translation'])
            ->orderBy('id', 'desc')
            ->simplePaginate(12, ['*'], 'page', $page);
    });
}

// 路由
Route::get('/albums/{page?}', 'AlbumController@list');

额外注意

修改代码后,需要手动清除现有缓存(比如执行php artisan cache:clear),避免旧缓存继续影响结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:55:16