Laravel中如何使用CASE语句实现指定规则的多字段排序?
嘿,这个自定义排序需求在Laravel里用orderByRaw()就能完美搞定,它允许我们直接写入原生SQL排序逻辑,刚好适配你这种多条件的CASE排序场景。
你只需要把三个排序规则依次通过链式调用添加进去就行,代码示例如下:
return $this->hasMany('Link') // 第一步:按lang的自定义规则排序(升序,1→2→3) ->orderByRaw("CASE `lang` WHEN 'a' THEN 1 WHEN 'as' THEN 2 WHEN 'asd' THEN 3 END") // 第二步:按quality的自定义规则排序(升序,1→10) ->orderByRaw("CASE `quality` WHEN 'd' THEN 1 WHEN 'ds' THEN 2 WHEN 'dsa' THEN 3 WHEN 'dsaa' THEN 4 WHEN 'dsaaa' THEN 6 WHEN 'dsaaaa' THEN 7 WHEN 'dsaaaaa' THEN 8 WHEN 'dsaaaaaaaaa' THEN 9 WHEN 'dsaaaa' THEN 10 END") // 第三步:按views降序排序 ->orderBy('views', 'desc');
补充说明:
orderByRaw()是Laravel提供的原生SQL排序方法,能直接支持复杂的CASE逻辑,比普通的orderBy()灵活得多。- 默认情况下,CASE语句的结果是升序排列的(数值小的在前),如果需要倒序,只需要在CASE语句末尾加
DESC即可,比如:CASE ... END DESC。 - 字段名外的反引号(
`)是为了避免字段名与SQL关键字冲突,如果你确定lang、quality不是关键字,也可以省略,但加上更稳妥。 - 最后一步的views排序用普通的
orderBy('views', 'desc')就足够,当然你也可以写成orderByRaw('views DESC'),效果完全一致。
内容的提问来源于stack exchange,提问作者Ibrahim Aldar
相关产品推荐
相关产品推荐

