Laravel如何做模型查询结果游标分页唯一排序_Laravel联合ID确保稳定性【教程】

大强吖_9988

大强吖_9988

2026-04-24

967人浏览

原创

游标分页在 Laravel 中需确保排序字段全局唯一且严格单调,否则 cursorPaginate() 会跳数或重复;id 回收、created_at 重复、复合主键等场景须用 orderByRaw 构造稳定游标或手写 WHERE 元组比较逻辑。

laravel如何做模型查询结果游标分页唯一排序_laravel联合id确保稳定性【教程】

游标分页在 Laravel 中不能靠 orderBy('id') 简单实现,尤其当模型有联合主键、软删除、或 ID 不严格递增时,直接用 ID 做游标会跳数据或重复。

为什么 cursorPaginate() 默认不安全

Laravel 的 cursorPaginate() 要求排序字段「全局唯一 + 严格单调」,但现实中:id 可能被回收(如软删除后重建)、时间戳字段(created_at)可能重复、复合业务主键(如 tenant_id + order_no)无法直接用于默认游标逻辑。

  • 常见错误现象:cursorPaginate(10)->links() 返回的下一页 URL 中 cursor=xxx 对应记录在后续请求中消失,或同一条记录反复出现
  • 根本原因:游标值不是“位置锚点”,而是“上一页最后一条的排序字段值”;若该字段不唯一,数据库 WHERE > ? 就会漏掉或重复匹配
  • 必须确保 orderBy() 的字段组合在全表范围内无重复 —— 单独 id 行,但 created_at 不行,status 更不行

用 orderByRaw() 拼联合唯一游标字段

当主键是复合型(比如 shop_id + sku_code),或需兼顾软删除与时间顺序时,得手动构造稳定排序表达式,让每行都有确定可比的“游标值”。

Laravel Cloud
Laravel Cloud

Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。

下载
  • 场景:查询已启用的商品,按上架时间倒序,但同一秒可能上架多个,且 deleted_at 为空才有效
  • 正确做法:用 orderByRaw("COALESCE(deleted_at, '9999-12-31') ASC, created_at DESC, id DESC") —— 把软删除记录排到底部,再用 created_at + id 保唯一
  • 注意:所有字段必须加 SELECT,否则 cursorPaginate() 内部取游标值时会报 Column not found
  • 性能影响:orderByRaw 若含函数(如 COALESCE),MySQL 可能无法走索引;建议建联合索引:ALTER TABLE products ADD INDEX idx_cursor (deleted_at, created_at, id);

手写游标逻辑:绕过 cursorPaginate() 的限制

当排序字段无法满足唯一性,又不想改表结构或加索引,就放弃 Laravel 自带方法,自己控制游标边界。

  • 核心思路:把上一页最后一条的完整排序字段值(如 ['created_at' => '2024-05-01 10:00:00', 'id' => 123])编码进 URL,下一页查 WHERE (created_at, id)
  • 用法示例:
    DB::table('products')
        ->where('status', 1)
        ->where(function ($q) use ($cursor) {
            $q->where('created_at', 'orWhere(function ($q2) use ($cursor) {
                  $q2->where('created_at', '=', $cursor['created_at'])
                     ->where('id', 'orderBy('created_at', 'desc')
        ->orderBy('id', 'desc')
        ->limit(20)
        ->get();
  • 坑点:PostgreSQL 支持元组比较 WHERE (a,b) > (?,?),但 MySQL 8.0.1 之前不支持,必须拆成 OR 嵌套条件
  • 兼容性:此方式不依赖 Eloquent,适合复杂查询或跨模型关联场景,但需自行处理空游标(第一页)、方向翻转(上一页)等边界

真正麻烦的从来不是写几行代码,而是确认哪几个字段组合起来,在你这张表里、这个业务周期内、所有写入路径下,真的不会产生重复排序值 —— 这个验证没法靠文档,得看日志、查历史数据、甚至压测造冲突。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

877

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

855

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2508

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

4541

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

6630

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

4356

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

8189

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1496

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

215

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 218人学习

Composer手册
Composer手册

共0课时 | 0人学习