
Laravel 注册表单中 的 grade 值始终存为 NULL,主因是模型未开放该字段批量赋值权限,需在 User 模型中将 grade 加入 $fillable 数组,并补充前端校验与后端验证逻辑。
laravel 注册表单中 `
在 Laravel 中,使用 User::create() 批量赋值(mass assignment)时,所有待写入字段必须显式声明在模型的 $fillable 数组中,否则即使请求中存在该参数,Laravel 也会静默忽略——这正是 grade 字段始终存为 NULL 的根本原因。
✅ 正确配置步骤
1. 更新 User 模型(app/Models/User.php)
确保 grade 字段被包含在 $fillable 中:
// app/Models/User.php
protected $fillable = [
'name',
'email',
'password',
'grade', // ← 关键:必须添加此项
];⚠️ 注意:若你使用了
$guarded = ['*']或未定义$fillable,则需统一采用白名单模式(推荐),并确认无拼写错误(如grad、Grade等)。
2. 修复前端 HTML:移除无效的默认选中项
当前 <option selected>Select a grade</option> 没有 value,提交时会发送空字符串 "",而 Laravel 验证器默认不拒绝空字符串(除非显式约束)。建议改为带 value="" 的占位项,并设置 required 属性增强语义:
<!-- register.blade.php -->
<div class="mt-4">
<x-label for="grade" :value="__('Grade')" />
<select class="form-control" name="grade" required>
<option value="">-- Select a grade --</option>
@for($i = 5; $i <= 13; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
</div>✅ 改进点:
value=""明确传递空值;required触发浏览器原生校验;循环上限修正为(对应年级 5–13,共9个年级)。
3. 完善后端验证逻辑
在 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' => $request->grade, // 现在可安全赋值
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
}4. (可选)数据库迁移检查
确认 users 表中 grade 字段允许 NULL 或已设默认值(如需强制非空,可在迁移中调整):
// 在迁移文件中(如 create_users_table.php)
$table->tinyInteger('grade')->nullable(); // 推荐先保留 nullable,便于调试
// 或
$table->tinyInteger('grade')->default(5); // 设默认值? 调试小技巧
- 使用
dd($request->all())检查请求是否实际携带grade; - 查看 Laravel 日志(
storage/logs/laravel.log)确认是否有 mass assignment 异常(虽然静默忽略时不报错,但开启APP_DEBUG=true并检查模型日志可辅助判断); - 运行
php artisan tinker测试手动创建:User::create(['name'=>'t','email'=>'t@e','password'=>'xxx','grade'=>8])—— 若仍为NULL,即确认是$fillable问题。
遵循以上四步,grade 将准确写入数据库,且具备完整验证与用户体验保障。


















