Laravel中nullable字段创建数据时提示“cannot be null”错误
问题排查与解决方案
1. 先确认数据库字段的实际状态
别光看迁移文件,直接查数据库里的ladders表结构:
- 用数据库客户端查看
description字段的Nullable属性是否为YES,默认值是否设为NULL - 或者执行SQL命令:
DESCRIBE ladders;,检查对应行的Null列是否为YES
如果字段实际不允许null,说明迁移没正确执行:
- 本地开发环境可以回滚重跑迁移:
php artisan migrate:rollback && php artisan migrate - 生产环境直接用SQL修改字段:
ALTER TABLE ladders MODIFY COLUMN description TEXT NULL;
2. 检查控制器的验证规则
你的验证规则必须明确允许description字段可省略或为空,示例如下:
$validated = $request->validate([ // 其他必填字段的规则 'description' => 'nullable|string', ]);
如果验证规则里没加nullable,或者根本没把description加入验证规则:
- 没加
nullable的话,提交空值会被验证拦截(但你报的是数据库错误,所以更可能是后者) - 没加入验证规则的话,请求里省略该字段时,
$validated数组里就没有这个键,create方法不会传递该字段给数据库,而如果数据库字段没设默认值且不允许null,就会触发“Field 'description' doesn't have a default value”错误。这种情况可以手动补默认值:
Ladders::create(array_merge($validated, [ 'description' => $request->input('description') ?? null, ]));
3. 确认Model的$fillable配置
你已经把description加入$fillable了,这部分没问题,但要仔细检查字段名的拼写、大小写是否和数据库完全一致(比如别写成desc或者Description)。
内容的提问来源于stack exchange,提问作者theyve
相关产品推荐
相关产品推荐

