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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:53:12