Laravel:如何为code列添加仅允许3位非数字字符串的列约束
Laravel中code字段的规则约束实现
要实现code列仅存储长度为3的非纯数字字符串,需要从数据库、模型、业务验证三层叠加约束,避免单一层校验被绕过:
数据库层约束
这是数据落库的最后一道兜底约束,直接在表结构层面限制写入规则:
- 字段类型选用定长字符串类型
char(3),从存储结构上固定字段长度为3个字符,比变长的varchar更适配固定长度的编码场景,从根源避免超长内容写入。 - 追加
CHECK约束做格式校验,在迁移文件中编写正则规则,拦截纯数字内容写入,示例迁移代码:
// 迁移文件内的字段定义 $table->char('code', 3)->comment('业务编码'); // 针对MySQL8.0+、PostgreSQL等支持CHECK约束的数据库,追加格式校验 $table->rawCheck('CHAR_LENGTH(code) = 3 AND code NOT REGEXP "^[0-9]+$"');
注意:5.x版本的MySQL不强制生效CHECK约束,这类环境必须配合上层校验使用。
Eloquent模型层约束
用于拦截项目内部逻辑写入的非法数据,避免绕过入口验证的脏数据落库:
- 在对应模型的
$casts属性中声明code字段的类型转换为字符串,避免框架自动将形似数字的内容转为数值类型:
// 对应模型文件内 protected $casts = [ 'code' => 'string', ];
- 可按需注册模型的
saving事件钩子,在数据写入前自动校验code字段格式,不符合规则直接抛出异常阻断写入。
业务请求验证层约束
这是接口/表单入口的第一道校验,拦截外部传入的非法参数:
在表单验证规则中组合以下规则即可:
string:强制传入值必须为字符串类型size:3:针对字符串类型的字段,该规则会校验字符长度严格等于3not_regex:/^[0-9]+$/:校验传入内容不能是纯数字组成的字符串- 可按需追加
alpha(仅允许大小写字母)、alpha_num(允许字母+数字组合,排除特殊符号)等规则限制字符范围,示例代码:
// 控制器或自定义表单请求中的验证规则 $validated = $request->validate([ 'code' => ['required', 'string', 'size:3', 'not_regex:/^[0-9]+$/'] ]);
内容的提问来源于stack exchange,提问作者vivek.p.n manu
相关产品推荐
相关产品推荐

