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

Laravel Eloquent中如何让orderBy忽略0与null值

解决Laravel中排序时忽略null/0值的问题

如果希望在排序时让position字段为null或0的记录排在所有有有效索引值的记录后面,可以分两种场景处理:

1. 数据库查询阶段处理(推荐,性能更优)

直接在Eloquent查询中通过orderByRaw自定义排序逻辑,把null或0的记录标记为优先级更低的分组,再按position升序:

$listing = Product::orderByRaw('CASE WHEN position IS NULL OR position = 0 THEN 1 ELSE 0 END, position ASC')->get();

这里的CASE语句会给position为null或0的行分配一个1的标记,其他行分配0,排序时先按这个标记升序,所以非0非null的行会排在前面,之后再按position的实际值升序排列。

2. 集合层面处理(已获取数据后排序)

如果已经通过get()拿到了集合,想要在内存中排序,可以用sort方法自定义比较逻辑:

$listing = Product::get();
$listing = $listing->sort(function ($itemA, $itemB) {
    // 将null/0的position替换为最大整数,确保它们排在最后
    $posA = $itemA->position === null || $itemA->position == 0 ? PHP_INT_MAX : $itemA->position;
    $posB = $itemB->position === null || $itemB->position == 0 ? PHP_INT_MAX : $itemB->position;
    
    // 太空船运算符实现升序比较
    return $posA <=> $posB;
})->values(); // 重置集合索引,避免原键名混乱

这种方式会把null或0的position值替换成PHP的最大整数,这样在排序时它们自然会落在所有有效索引值的后面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:25:27