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

Laravel 8如何从其他表拉取数据存入用户表并解决grade_level_id无默认值报错

错误原因

  1. 表单提交的字段名和你需要存入的字段不匹配:表单中下拉框的name是grade_level[](数组类型,且开启了多选),但你要存入users表的字段是grade_level_id,$request->all()里根本没有grade_level_id这个键,执行User::create($input)的时候该字段为空。
  2. 赋值时机错误:你在User::create()执行完成后才给grade_level_id赋值,但是create方法执行时就已经触发了SQL写入操作,非空字段没有值也没有默认值,直接触发1364报错。
  3. 额外注意:如果你的$request里已经有grade_level_id的值,还要检查User模型的$fillable属性是否加入了grade_level_id,否则创建时该字段会被Laravel的批量赋值过滤,仍然为空。

解决方案(按你的业务场景二选一)

场景1:一个用户只关联一个年级

  • 第一步:修改表单,去掉多选属性,修正字段名
{!! Form::select('grade_level_id', $grade_level,[], array('class' => 'form-control')) !!}
  • 第二步:确认User模型的$fillable包含grade_level_id
// App\Models\User.php
protected $fillable = [
    'f_name', 'm_name', 'l_name', 'sex', 'id_number', 'address', 'username', 'password', 'grade_level_id'
];
  • 第三步:修改后的store方法无需额外单独赋值grade_level_id,create时会自动写入,参考代码:
public function store(Request $request)
{     
    $this->validate($request, [
        'f_name' => 'required',
        'm_name' => 'required',
        'l_name' => 'required',
        'sex' => 'required',
        'id_number' => 'required',
        'address' => 'required',
        'username' => 'required|unique:users',
        'password' => 'required|same:confirm-password',
        'grade_level_id' => 'required|exists:grade_levels,id',
        'roles' => 'required'  
    ]);

    $input = $request->all();
    $input['password'] = Hash::make($input['password']);
    $user = User::create($input);
    $user->assignRole($request->input('roles'));

    return redirect()->route('users.index')
                    ->with('success','User created successfully');
}

场景2:一个用户需要关联多个年级

你的users表设计不合理,不能直接存grade_level_id单字段,需要新增中间表user_grade_level做用户和年级的多对多关联,关联逻辑和角色分配一致:

  • 第一步:在User模型中定义多对多关联
public function gradeLevels()
{
    return $this->belongsToMany(GradeLevel::class);
}
  • 第二步:修改验证规则,验证提交的年级数组合法性
'grade_level' => 'required|array',
'grade_level.*' => 'exists:grade_levels,id',
  • 第三步:创建用户后关联年级,不需要给users表的grade_level_id赋值(可以删掉这个多余字段)
$user = User::create($input);
$user->gradeLevels()->sync($request->grade_level);
$user->assignRole($request->input('roles'));

内容的提问来源于stack exchange,提问作者Tartaglia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:45:04