Laravel创建用户时role字段无默认值报错求合规解决方案
报错:Field 'role' doesn't have a default value
我在Stack Overflow查找过同类问题的解决方案,但尝试后仍未解决。我知道使用protected $guarded = []或在数据库中设置nullable可以解决问题,但这不符合代码规范,不适用于我的场景。
相关代码
users表迁移代码
public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('staff_id')->nullable(); $table->string('name'); $table->string('email')->unique(); $table->string('department')->nullable(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('role'); $table->rememberToken(); $table->foreignId('current_team_id')->nullable(); $table->string('profile_photo_path', 2048)->nullable(); $table->timestamps(); }); }
User模型代码
protected $fillable = [ 'name', 'email', 'password', 'role', ];
Fortify创建用户控制器代码
<?php namespace App\Actions\Fortify; use App\Models\User; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Laravel\Fortify\Contracts\CreatesNewUsers; use Laravel\Jetstream\Jetstream; class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; /** * Validate and create a newly registered user. * * @param array $input * @return \App\Models\User */ public function create(array $input) { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', ])->validate(); $user = User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]); $user->role = 'user'; return $user; } }
User控制器代码
<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function index() { $user = User::get(); return view('users.index', compact('user')); } }
解决方案
问题根源是CreateNewUser控制器的create方法逻辑错误:调用User::create()时没有传入必填的role字段,数据库执行插入操作时因该字段无默认值触发报错,后续给$user->role = 'user'的赋值已经无法影响之前的插入操作。
以下两种合规解决方式:
- 在
create方法的参数数组中直接传入role
修改User::create的参数,一次性完成所有必填字段赋值:
$user = User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), 'role' => 'user', // 新增该行 ]); return $user;
这种方式符合Laravel批量赋值规范(role已在$fillable中),确保插入操作时所有必填字段都有值。
- 使用模型实例化+
save()分步创建
先实例化模型,赋值所有字段后再执行保存:
$user = new User(); $user->name = $input['name']; $user->email = $input['email']; $user->password = Hash::make($input['password']); $user->role = 'user'; $user->save(); return $user;
这种方式同样能保证插入前所有必填字段都已赋值,避免数据库报错。
内容的提问来源于stack exchange,提问作者jabs93
相关产品推荐
相关产品推荐

