You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表单:

    1. 确认是否包含created_by和updated_by的输入字段(比如下拉选择用户或隐藏域),且name属性正确设置为created_by、updated_by
    2. 如果是选择用户,确保选项的value是正确的用户标识(如果是外键关联用户ID,就传ID而非用户名)
  • 模型批量赋值限制
    打开Service模型,检查$fillable数组是否包含created_by和updated_by:

    protected $fillable = [
        // 其他已有的字段
        'created_by',
        'updated_by'
    ];
    

    如果没有添加,批量赋值(比如update($request->all()))会自动忽略这两个字段,导致它们保持null触发约束错误。

  • 控制器赋值逻辑问题
    看你的update方法:

    1. 如果是手动赋值,确保你从请求中正确获取了这两个字段的值并赋值给模型:
      $service->created_by = $request->input('created_by');
      $service->updated_by = $request->input('updated_by');
      $service->save();
      
    2. 如果是批量更新,要确保在传入的数组中包含这两个字段:
      $service->update($request->only([
          // 其他字段
          'created_by',
          'updated_by'
      ]));
      
  • 表结构与数据类型匹配问题
    注意:如果created_by和updated_by是services表的外键(关联users表的id),不能直接存储用户名,应该存储用户ID:

    1. 检查表结构,确认这两个字段是int类型而非字符串
    2. 表单中应该提供用户选择(比如下拉框,选项值为用户ID,显示用户名),提交时传递用户ID而非用户名
    3. 如果需要展示用户名,通过模型关联获取:
      // Service模型中定义关联
      public function creator()
      {
          return $this->belongsTo(User::class, 'created_by');
      }
      
      // 视图中展示用户名
      {{ $service->creator->name }}
      
  • 默认值兜底
    如果更新者默认是当前登录用户,可以在控制器中直接赋值,避免表单未传递值的问题:

    $service->updated_by = auth()->id();
    

内容的提问来源于stack exchange,提问作者Hassaan adeel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:05:12