Laravel中priority字段已设默认值仍报字段不可为空完整性约束错误
问题原因
- 你提交的数据中明确携带了
priority => null,Laravel执行fill()方法时会将该null值直接赋值给模型的priority属性,最终生成的SQL插入语句会主动带上priority字段,值为null。 - 数据库的字段默认值仅在插入语句未包含该字段时才会触发,主动传递null值的场景下不会启用默认值逻辑。
- 你的迁移文件仅为
priority字段设置了default(1),没有添加->nullable()修饰,该字段本质仍为NOT NULL约束,插入null值自然触发完整性约束错误。
解决方法
根据你的业务需求可选择以下任意一种方案:
- 过滤null值的priority字段(推荐)
该方案可以完美复用数据库设置的默认值逻辑,在控制器拿到请求数据后,删除值为null的priority字段即可:
$data = $request->except('_token'); // 新增以下代码 if (isset($data['priority']) && is_null($data['priority'])) { unset($data['priority']); }
处理后插入SQL不会包含priority字段,数据库会自动使用预设的默认值1。
- 控制器层直接赋值默认值
在控制器层对priority做兜底默认值处理,逻辑更直观可控,不需要依赖数据库默认值:
$data = $request->except('_token'); $data['priority'] = $data['priority'] ?? 1;
无论前端传null还是未传priority字段,都会被赋值为1。
- 模型层设置默认属性
在ScanProfile模型中设置默认属性,当未传入有效值时自动使用1:
// 在ScanProfile模型中添加以下代码 protected $attributes = [ 'priority' => 1 ];
注意该方案如果前端明确传递了null值还是会覆盖默认属性,建议配合方案1的过滤逻辑使用。
不推荐方案:在迁移文件给
priority字段加->nullable(),这种方式虽然可以解决报错,但会导致priority被存入null值,不符合默认值为1的业务需求。
内容的提问来源于stack exchange,提问作者Ronak Ahir
相关产品推荐
相关产品推荐

