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处连带问题,会导致即使解决当前非空报错,后续功能依然异常:
- Post模型的关联方法拼写错误:
belognsTo是拼写笔误,正确应为belongsTo,后续读取帖子对应用户信息时会直接抛方法不存在的错误。 - Post模型的
$fillable数组未包含user_id,即使控制器传入user_id,也会被Laravel的批量赋值保护机制拦截,无法写入数据库。 - 当前代码直接把PHP上传文件的临时路径(
C:\xampp\tmp\phpB7DC.tmp)存入数据库,没有执行实际的文件持久化存储,后续读取图片时会完全失效。
- Post模型的关联方法拼写错误:
分步解决方法
- 调整路由配置:将发帖相关的
create、store路由通过auth中间件包裹,保证只有登录用户才能访问发帖功能,为后续获取用户ID提供前提。注意:如果未给发帖路由配置auth中间件,
auth()->id()会返回null,依然会触发user_id非空的报错。 - 修改
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(); } - 修正Post模型的配置问题:
- 将
user_id加入允许批量赋值的字段列表:protected $fillable = [ 'caption', 'image', 'user_id', ]; - 修正关联方法的拼写错误:
public function user() { return $this->belongsTo(User::class); }
- 将
- 迁移文件无需修改:当前迁移中将
user_id设为非空、加索引的设计是合理的(帖子必须归属登录用户),不需要调整表结构,只要保证插入时正确传入user_id即可。如果之前已经执行过迁移,不需要回滚重建表。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

