Laravel保存评论触发SQL 1364错误:blog_id字段无默认值求助
问题分析与解决方案
核心原因:字段名完全不匹配
报错的本质是数据库表要求的必填字段与代码中赋值的字段名不一致,导致blog_id和profile_id这两个非空外键字段未被赋值,触发MySQL的非空约束错误。
具体错误点
- 迁移文件冗余字段:你在迁移中同时定义了
blogun_id、profilin_id和外键字段blog_id、profile_id,但实际业务需要的是外键字段,blogun_id、profilin_id属于无效冗余字段。 - 代码赋值错误:代码中给
blogun_id和profilin_id赋值,但数据库要求的是blog_id和profile_id,这两个字段才是关联外键且默认非空。
修复步骤
1. 清理数据库冗余字段
如果原迁移已经执行,创建新迁移删除多余字段:
php artisan make:migration remove_redundant_fields_from_comments_table
在新迁移文件中添加删除逻辑:
Schema::table('comments', function (Blueprint $table) { $table->dropColumn(['blogun_id', 'profilin_id']); });
执行迁移:
php artisan migrate
如果原迁移未执行,直接修改原迁移文件,删除blogun_id和profilin_id的定义,最终迁移代码如下:
Schema::create('comments', function (Blueprint $table) { $table->id(); $table->string('content',250)->nullable(false); $table->boolean('status')->default(true)->comment('1为启用,0为禁用'); // 外键关联字段 $table->foreignId('blog_id')->references('id')->on('blogs')->cascadeOnDelete(); $table->foreignId('profile_id')->references('id')->on('profiles')->cascadeOnDelete(); $table->timestamps(); });
2. 修正代码中的字段赋值
将保存逻辑里的字段名改为数据库对应的blog_id和profile_id:
$validatedData = Validator::make($request->all(), [ 'comment' => 'required', 'blog_id' => 'required', ]); if ($validatedData->fails()) { $errors = $validatedData->errors()->all(); // 修正错误提示,匹配当前场景 return redirect()->back()->with('error', '评论内容或博客ID填写错误!'); } $comment = new Comment(); $comment->content = $request->comment; $comment->status = true; $comment->blog_id = (int)$request->blog_id; $comment->profile_id = Auth::user()->profile->id; $comment->save();
3. 确保模型支持批量赋值
在Comment模型中添加可赋值字段列表,避免Laravel批量赋值保护拦截:
class Comment extends Model { protected $fillable = ['content', 'status', 'blog_id', 'profile_id']; }
可选优化
可以使用validated()方法结合create()简化代码:
$validated = $validatedData->validated(); Comment::create([ 'content' => $validated['comment'], 'status' => true, 'blog_id' => $validated['blog_id'], 'profile_id' => Auth::user()->profile->id, ]);
内容的提问来源于stack exchange,提问作者mehmet Dora
相关产品推荐
相关产品推荐

