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

如何在Laravel中通过POST方法实现支持无限滚动的分页API

Laravel POST 分页实现方案(适配无限滚动+存储过程)

1. 定义POST路由

在routes/api.php中添加接口路由,用于接收分页与排序参数:

Route::post('/transactions', [TransactionController::class, 'index']);

2. 控制器核心逻辑处理

在控制器中完成参数校验、存储过程调用、分页数据封装的流程:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TransactionController extends Controller
{
    public function index(Request $request)
    {
        // 校验请求参数,同时设置默认值
        $validated = $request->validate([
            'page' => 'integer|min:1|nullable',
            'per_page' => 'integer|min:1|max:100|nullable',
            'sort_field' => 'string|in:name,amount,created_at|nullable', // 按实际业务字段调整
            'sort_dir' => 'string|in:asc,desc|nullable',
            // 按需添加其余4-5个排序/筛选参数的校验规则
        ]);

        // 提取参数,赋予默认值
        $page = $validated['page'] ?? 1;
        $perPage = $validated['per_page'] ?? 20;
        $sortField = $validated['sort_field'] ?? 'created_at';
        $sortDir = $validated['sort_dir'] ?? 'desc';
        // 示例:如果需要用户维度筛选,可获取用户ID
        // $userId = $validated['user_id'] ?? auth()->id();

        // 计算分页偏移量
        $offset = ($page - 1) * $perPage;

        // 调用存储过程,传入排序、分页参数
        // 假设存储过程名为get_user_transactions,参数需与存储过程定义对应
        $transactions = DB::select(
            'CALL get_user_transactions(?, ?, ?, ?)',
            [$sortField, $sortDir, $offset, $perPage]
        );

        // 获取总数据条数(需单独编写统计存储过程或查询)
        $total = DB::selectOne('CALL count_user_transactions(?)', [$userId])->total;

        // 构造符合要求的响应格式
        return response()->json([
            'Transactions' => $transactions,
            'pagination' => [
                'current_page' => $page,
                'per_page' => $perPage,
                'total' => $total,
                'last_page' => ceil($total / $perPage)
            ]
        ]);
    }
}

3. 存储过程适配调整

确保存储过程支持接收排序、分页参数,示例MySQL存储过程逻辑:

DELIMITER //
CREATE PROCEDURE get_user_transactions(
    IN sort_field VARCHAR(50),
    IN sort_dir VARCHAR(4),
    IN offset_val INT,
    IN per_page_val INT
)
BEGIN
    -- 借助控制器的白名单校验避免SQL注入,拼接动态排序语句
    SET @sql = CONCAT(
        'SELECT name, amount, created_at FROM user_transactions ',
        'ORDER BY ', sort_field, ' ', sort_dir, ' ',
        'LIMIT ?, ?'
    );
    PREPARE stmt FROM @sql;
    SET @offset = offset_val;
    SET @per_page = per_page_val;
    EXECUTE stmt USING @offset, @per_page;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

-- 统计总条数的存储过程示例
DELIMITER //
CREATE PROCEDURE count_user_transactions(IN user_id INT)
BEGIN
    SELECT COUNT(*) AS total FROM user_transactions WHERE user_id = user_id;
END //
DELIMITER ;

4. 安卓端无限滚动适配

安卓端触发滚动加载时,发送POST请求携带以下参数:

  • 下一页的page值(每次加载后page +=1)
  • 固定的per_page值
  • 当前生效的sort_field与sort_dir等参数

通过响应中pagination.last_page判断是否还有更多数据:

  • 若current_page < last_page,继续加载下一页
  • 否则停止加载逻辑

关键注意点

  • SQL注入防护:控制器中通过白名单校验排序字段,避免动态排序带来的注入风险
  • 总条数获取:需单独实现统计逻辑,确保分页数据的完整性
  • 参数容错:给所有请求参数设置合理默认值,避免前端未传参时出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:35:20