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

