SQLSTATE[23000]约束违规:created_by/updated_by非空问题排查
问题排查与解决方案
核心错误分析
你遇到的SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'created_by' and 'updated_by' cannot be null错误,本质是更新操作时这两个字段被赋值为null,但表结构设置了非空约束;同时你试图修改创建者/更新者用户名的操作无效,大概率是字段传递、赋值逻辑或表结构设计的问题。
逐一排查点及解决方法
表单字段未正确传递值
检查你的edit.blade.php表单:- 确认是否包含
created_by和updated_by的输入字段(比如下拉选择用户或隐藏域),且name属性正确设置为created_by、updated_by - 如果是选择用户,确保选项的
value是正确的用户标识(如果是外键关联用户ID,就传ID而非用户名)
- 确认是否包含
模型批量赋值限制
打开Service模型,检查$fillable数组是否包含created_by和updated_by:protected $fillable = [ // 其他已有的字段 'created_by', 'updated_by' ];如果没有添加,批量赋值(比如
update($request->all()))会自动忽略这两个字段,导致它们保持null触发约束错误。控制器赋值逻辑问题
看你的update方法:- 如果是手动赋值,确保你从请求中正确获取了这两个字段的值并赋值给模型:
$service->created_by = $request->input('created_by'); $service->updated_by = $request->input('updated_by'); $service->save(); - 如果是批量更新,要确保在传入的数组中包含这两个字段:
$service->update($request->only([ // 其他字段 'created_by', 'updated_by' ]));
- 如果是手动赋值,确保你从请求中正确获取了这两个字段的值并赋值给模型:
表结构与数据类型匹配问题
注意:如果created_by和updated_by是services表的外键(关联users表的id),不能直接存储用户名,应该存储用户ID:- 检查表结构,确认这两个字段是
int类型而非字符串 - 表单中应该提供用户选择(比如下拉框,选项值为用户ID,显示用户名),提交时传递用户ID而非用户名
- 如果需要展示用户名,通过模型关联获取:
// Service模型中定义关联 public function creator() { return $this->belongsTo(User::class, 'created_by'); } // 视图中展示用户名 {{ $service->creator->name }}
- 检查表结构,确认这两个字段是
默认值兜底
如果更新者默认是当前登录用户,可以在控制器中直接赋值,避免表单未传递值的问题:$service->updated_by = auth()->id();
内容的提问来源于stack exchange,提问作者Hassaan adeel
相关产品推荐
相关产品推荐

