如何按两种不同参数类型排序数据?含Halal标签与库存排序需求
解决方法:自定义优先级排序
你的核心需求是先按「是否满足Halal标签+库存>40」的条件排序,再按库存降序,原代码用havingRaw是错误的——havingRaw用于过滤聚合查询(比如带GROUP BY)的结果,无法控制排序优先级,还会直接过滤掉不满足条件的数据,不符合你「优先展示而非过滤」的需求。
正确做法是通过orderByRaw实现自定义排序规则:
$data = $data->orderByRaw("CASE WHEN halal = 1 AND product > 40 THEN 1 ELSE 0 END DESC") ->orderBy('product', 'desc');
代码说明:
CASE WHEN halal = 1 AND product > 40 THEN 1 ELSE 0 END:生成临时排序字段,满足条件的产品赋值为1,不满足的赋值为0- 第一个
DESC:让赋值为1的产品排在最前面,实现优先展示的需求 - 后续的
orderBy('product', 'desc'):保证同一优先级内的产品,按库存从高到低排序
注意点:
- 确认数据库中库存字段名确实是
product,避免因字段名错误导致逻辑失效 - 若使用非MySQL数据库(如PostgreSQL),CASE语句语法略有差异,但核心逻辑一致,只需调整对应语法即可
内容的提问来源于stack exchange,提问作者Reza Gunadi
相关产品推荐
相关产品推荐

