如何在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
相关产品推荐
相关产品推荐

