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

