Laravel Eloquent查询如何截取字段中小数点前的字符内容
解决方案
可以直接在查询语句中实现该需求,根据你使用的数据库类型,对应实现方式如下:
1. 数据库层面处理(性能最优)
MySQL环境
使用MySQL内置的SUBSTRING_INDEX函数实现按小数点截取前缀,示例代码如下:
$po_number= DB::table('supplierorders') ->select('supplierorders.*', DB::raw("SUBSTRING_INDEX(po_number, '.', 1) as po_number_prefix")) ->orderBy('po_number','asc') ->get();
- 字段说明:
SUBSTRING_INDEX(字段名, 分隔符, 截取位置),第三个参数传1代表取第一个分隔符之前的所有内容 - 取值方式:查询完成后通过
$item->po_number_prefix即可获取PO995这类无后缀的结果 - 如果需要直接覆盖原有
po_number字段返回值,可将select部分修改为:->select(DB::raw("SUBSTRING_INDEX(po_number, '.', 1) as po_number, supplierorders.*"))
其他数据库适配
- PostgreSQL:替换函数为
SPLIT_PART(po_number, '.', 1) - SQL Server:替换函数为
LEFT(po_number, CHARINDEX('.', po_number) - 1)
2. 集合层面处理(全数据库兼容)
如果需要兼容多种数据库,不想编写数据库专属SQL,可以在获取查询结果后通过Laravel集合的map方法处理:
$po_number= DB::table('supplierorders') ->select('supplierorders.*') ->orderBy('po_number','asc') ->get() ->map(function ($item) { // 按小数点分割取第一段 $item->po_number_prefix = explode('.', $item->po_number)[0]; return $item; });
这种方式无需调整SQL语句,缺点是数据量极大时处理效率略低于数据库层面直接计算。
内容的提问来源于stack exchange,提问作者Inno
相关产品推荐
相关产品推荐

