Laravel中数据库13位数字字段按指定规则加空格存储的实现问题
Laravel 13位数字格式化存储实现方案
1. 数据库字段适配
对应存储字段建议设置为varchar(16),13位数字加3个空格总长度为16,预留足够存储空间。
2. 新增模型修改器自动格式化
Laravel的Eloquent修改器可以在字段赋值时自动处理格式,无需每次手动调用格式化逻辑,示例代码如下(假设模型名为Record,存储字段为number_code):
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Record extends Model { // 新增修改器,赋值时自动格式化数字 public function setNumberCodeAttribute($value) { // 先过滤输入内的所有非数字字符,兼容用户带符号/空格的输入场景 $pureNumber = preg_replace('/\D/', '', $value); // 校验数字长度是否符合13位要求 if (strlen($pureNumber) !== 13) { throw new \InvalidArgumentException('输入内容必须为13位数字'); } // 拆分前9位和最后4位 $prefixPart = substr($pureNumber, 0, 9); $suffixPart = substr($pureNumber, -4); // 前9位每3位加空格拼接 $formattedPrefix = implode(' ', str_split($prefixPart, 3)); // 赋值到属性,最终存储格式符合要求 $this->attributes['number_code'] = $formattedPrefix . ' ' . $suffixPart; } }
使用时直接给字段赋纯数字值即可,系统会自动处理格式化:
$record = new Record(); $record->number_code = '1234567891234'; $record->save(); // 最终存储的number_code值为 123 456 789 1234
3. 可选:添加验证规则提前拦截异常输入
在表单请求或控制器中添加验证规则,提前校验输入合法性:
$validated = $request->validate([ 'number_code' => 'required|digits:13', ]);
digits:13规则会自动校验输入是否为13位纯数字,避免无效数据进入后续逻辑。
4. 可选:新增访问器快速获取纯数字值
如果后续业务需要使用不带空格的纯数字,可在模型中添加访问器:
public function getRawNumberCodeAttribute() { return preg_replace('/\D/', '', $this->attributes['number_code']); }
调用时直接读取属性即可获取纯数字:$record->raw_number_code。
内容的提问来源于stack exchange,提问作者Arthur Will
相关产品推荐
相关产品推荐

