You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'的赋值已经无法影响之前的插入操作。

以下两种合规解决方式:

  1. 在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中),确保插入操作时所有必填字段都有值。

  1. 使用模型实例化+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:31:06