
Laravel 中注册表单的 字段值未写入数据库、始终存为 NULL,通常是因为模型未将该字段声明为可批量赋值(fillable),或前端未正确传递值。本文详解排查步骤与完整修复方案。
laravel 中注册表单的 `
在 Laravel 中,使用 User::create() 批量赋值时,所有待写入字段必须显式声明在模型的 $fillable 数组中,否则 Laravel 会忽略该字段(安全机制),导致数据库对应列写入 NULL —— 这正是你遇到问题的根本原因。
✅ 正确修复步骤
1. 更新 User 模型:添加 grade 到 $fillable
打开 app/Models/User.php(或你的 User 模型文件),确保 grade 字段已加入可填充列表:
// app/Models/User.php
protected $fillable = [
'name',
'email',
'password',
'grade', // ← 关键:必须添加此项
];
⚠️ 注意:若你使用了 $guarded = ['id'] 或其他白名单策略,请统一改为 $fillable,避免冲突。
2. 修复 Blade 表单:移除无效的 selected 属性并添加 required
当前 <option selected>Select a grade</option> 不带 value,且未设 required,用户可能跳过选择,后端接收到空字符串 '',而 '' 赋值给整型字段时也可能被转为 NULL。建议优化如下:
<!-- register.blade.php -->
<div class="mt-4">
<x-label for="grade" :value="__('Grade')"></x-label><select class="form-control" name="grade" required><option value="" disabled selected>{{ __('Select a grade') }}</option>
@for($i = 5; $i {{ $i }}
@endfor
</select>
</div>
✅ 改进点:
-
value=""+disabled selected防止默认提交空值; -
required属性强制前端选择(配合后端验证更可靠); - 循环范围修正为
5 to 13(原5 → <code>5..13,共9个年级)。
3. 补充后端验证与数据处理
在 RegisteredUserController@store() 中,增加 grade 的验证规则,并确保传入整型值(避免字符串干扰):
// RegisteredUserController.php
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'grade' => ['required', 'integer', 'between:5,13'], // ← 新增验证
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'grade' => (int) $request->grade, // 强制转换为整型,防字符串注入
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
}
4. (可选)数据库迁移检查
确认 users 表中 grade 字段允许 NULL 或已设默认值(推荐允许 NULL,便于未选时留空;若业务要求必填,可设 NOT NULL DEFAULT 0 并调整验证逻辑):
// 在 migration 文件中(如 create_users_table.php)
$table->tinyInteger('grade')->nullable(); // 推荐
// 或
$table->tinyInteger('grade')->default(0); // 若需默认值
? 验证是否生效
- 提交注册表单,选择任意年级(如
8); - 查看数据库
users.grade字段,应显示8(非NULL); - 若仍为
NULL,请检查浏览器开发者工具 Network 标签页,确认grade是否随表单一起提交(Form Data 中是否存在grade=8)。
✅ 总结
| 问题环节 | 关键修复 |
|---|---|
| 模型层 |
User::$fillable 必须包含 'grade'
|
| 视图层 |
<select></select> 需有有效 value,禁用默认空选项,添加 required
|
| 控制器层 | 添加 grade 验证规则,强制类型转换 |
| 数据库层 | 确保字段类型兼容(如 TINYINT),允许 NULL 或设置合理默认值 |
遵循以上四步,即可彻底解决 Laravel 注册表单中下拉选项值无法入库的问题。











