Laravel 8如何从其他表拉取数据存入用户表并解决grade_level_id无默认值报错
错误原因
- 表单提交的字段名和你需要存入的字段不匹配:表单中下拉框的name是
grade_level[](数组类型,且开启了多选),但你要存入users表的字段是grade_level_id,$request->all()里根本没有grade_level_id这个键,执行User::create($input)的时候该字段为空。 - 赋值时机错误:你在
User::create()执行完成后才给grade_level_id赋值,但是create方法执行时就已经触发了SQL写入操作,非空字段没有值也没有默认值,直接触发1364报错。 - 额外注意:如果你的
$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
相关产品推荐
相关产品推荐

