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

Laravel按列排序时如何将库存为0的商品置于分页底部?

解决方案

你可以通过多字段排序实现需求:先按库存状态排序,确保有库存的商品排在前面,再按价格进行升序/降序排序。

核心逻辑

用CASE表达式标记库存状态:有库存(quantity > 0)的商品标记为0,无库存(quantity = 0)的标记为1。按这个标记升序排序时,0会排在1前面,自然把无库存商品压到分页底部,之后再按价格排序。

代码实现

按“最便宜”排序(升序)

$query->select([
    '*',
    DB::raw('IF(`discountPrice` IS NOT NULL, `discountPrice`, `price`) `sortPrice`'),
])
->orderBy(DB::raw('CASE WHEN quantity > 0 THEN 0 ELSE 1 END'), 'ASC')
->orderBy('sortPrice', 'ASC')
->paginate(15);

按“最贵”排序(降序)

$query->select([
    '*',
    DB::raw('IF(`discountPrice` IS NOT NULL, `discountPrice`, `price`) `sortPrice`'),
])
->orderBy(DB::raw('CASE WHEN quantity > 0 THEN 0 ELSE 1 END'), 'ASC')
->orderBy('sortPrice', 'DESC')
->paginate(15);

额外说明

如果你的quantity字段可能存在NULL值,可以调整CASE条件为:

CASE WHEN quantity IS NOT NULL AND quantity > 0 THEN 0 ELSE 1 END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:10:20