Laravel中paginate与get()返回结果排序及数据不一致问题
解决Laravel分页时数据缺失/重复的问题
问题原因
你遇到的问题本质是排序规则不唯一导致的。当用orderByRaw处理position字段的排序时,若存在多条记录的position值相同(或同为NULL),数据库无法保证这些记录的返回顺序固定。而分页依赖稳定的结果顺序来计算OFFSET偏移量,顺序不稳定就会出现数据跳页、重复的情况。
解决办法
给排序规则补充一个唯一字段(比如表的主键id),确保每条记录的排序位置唯一,让数据库返回的结果顺序固定。修改后的查询语句如下:
$game->teams() ->orderByRaw('CASE WHEN position IS NULL THEN 0 ELSE 1 END DESC') ->orderBy('position') ->orderBy('id') // 新增主键排序,保证顺序绝对稳定 ->with(['user']) ->paginate(15);
原理说明
数据库在处理LIMIT ... OFFSET ...分页时,必须依赖稳定的排序结果才能正确计算每页的内容。加上主键id后,即使多条记录的position排序值相同,最后也会通过唯一的id来确定顺序,这样每次查询的结果顺序完全一致,分页逻辑就不会出错了。
内容的提问来源于stack exchange,提问作者ssrsvn
相关产品推荐
相关产品推荐

