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

Laravel+SQLite提交新增帖子触发posts.user_id非空约束报错

报错根因定位
  • 你的posts表迁移中为user_id设置了非空约束($table->unsignedBigInteger('user_id')未声明可空),但执行插入操作时,构造的SQL完全没有为user_id字段赋值,直接触发SQLite的完整性校验报错——从你贴的执行SQL也能看到,插入的字段列表只有caption、image、updated_at、created_at,完全缺失必填的user_id。
  • 存在3处连带问题,会导致即使解决当前非空报错,后续功能依然异常:
    1. Post模型的关联方法拼写错误:belognsTo是拼写笔误,正确应为belongsTo,后续读取帖子对应用户信息时会直接抛方法不存在的错误。
    2. Post模型的$fillable数组未包含user_id,即使控制器传入user_id,也会被Laravel的批量赋值保护机制拦截,无法写入数据库。
    3. 当前代码直接把PHP上传文件的临时路径(C:\xampp\tmp\phpB7DC.tmp)存入数据库,没有执行实际的文件持久化存储,后续读取图片时会完全失效。
分步解决方法
  1. 调整路由配置:将发帖相关的create、store路由通过auth中间件包裹,保证只有登录用户才能访问发帖功能,为后续获取用户ID提供前提。

    注意:如果未给发帖路由配置auth中间件,auth()->id()会返回null,依然会触发user_id非空的报错。

  2. 修改PostsController的store方法,补充用户关联与图片持久化逻辑:
    public function store() {
        $validatedData = request()->validate([
            'caption' => 'required',
            'image' => 'required|image',
        ]);
    
        // 将上传的图片持久化存储到本地public磁盘,获取可访问的存储路径
        $imagePath = request('image')->store('post_images', 'public');
    
        // 合并处理后的图片路径、当前登录用户ID到待入库的数据数组
        $validatedData['image'] = $imagePath;
        $validatedData['user_id'] = auth()->id();
    
        \App\Post::create($validatedData);
        // 移除原调试用的dd()语句,替换为业务跳转逻辑
        return back();
    }
    
  3. 修正Post模型的配置问题:
    • 将user_id加入允许批量赋值的字段列表:
      protected $fillable = [
          'caption', 'image', 'user_id',
      ];
      
    • 修正关联方法的拼写错误:
      public function user() 
      {
          return $this->belongsTo(User::class);
      }
      
  4. 迁移文件无需修改:当前迁移中将user_id设为非空、加索引的设计是合理的(帖子必须归属登录用户),不需要调整表结构,只要保证插入时正确传入user_id即可。如果之前已经执行过迁移,不需要回滚重建表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 21:15:10