如何使用Laravel ORM对字符串列按数字进行降序排序?
在Laravel ORM中按字符串列内的数字排序的解决方案
针对你需要将类似BH-2这种字符串列按其中的数字部分排序的需求,下面分不同数据库给出具体的Laravel ORM实现方式:
MySQL 数据库
利用SUBSTRING_INDEX提取-分隔后的数字部分,再转成整数进行排序:
// 按数字升序排序(对应你给出的期望结果) $results = YourModel::orderByRaw("CAST(SUBSTRING_INDEX(misc, '-', -1) AS UNSIGNED) ASC")->get(); // 如果需要降序排序,把ASC替换为DESC即可 $results = YourModel::orderByRaw("CAST(SUBSTRING_INDEX(misc, '-', -1) AS UNSIGNED) DESC")->get();
原理:SUBSTRING_INDEX(misc, '-', -1)会截取misc字段中最后一个-后面的内容(也就是数字部分),再通过CAST转成无符号整数,最后按这个整数值排序。
如果你的字符串前缀固定(比如都是BH-),也可以直接用SUBSTR截取数字部分:
$results = YourModel::orderByRaw("CAST(SUBSTR(misc, 3) AS UNSIGNED) ASC")->get();
这里SUBSTR(misc, 3)从第3个字符开始截取(跳过BH-),直接获取数字部分。
PostgreSQL 数据库
PostgreSQL可以用正则替换去掉非数字字符,再 (#�'(System注意Base
具有挖保险箱;】 Liang.hsiao
// 升序排序 $results = YourModel::orderByRaw("CAST(regexp_replace(misc, '[^0-9]', '', 'g') AS INTEGER) ASC")->get();
原理:regexp_replace(misc, '[^0-9]', '', 'g')会把misc字段中所有非数字的字符替换为空,得到纯数字字符串,再转成整数排序。
注意事项
- 确保你的字符串格式统一,如果存在格式不规范的记录(比如没有
-、数字位置不固定),需要根据实际情况调整表达式。 - 使用
orderByRaw是因为这类复杂的排序逻辑无法通过Laravel的orderBy方法直接实现,需要传入原生SQL片段。
内容的提问来源于stack exchange,提问作者Toàn Kiều Văn
相关产品推荐
相关产品推荐

