Laravel中验证通过后直接关联子项更新/插入父模型
解决方案
首先需要拆分验证后的数据(父模型数据库不存在child字段,直接传入会报错),然后通过Eloquent关联方法,在父模型更新/创建完成后直接操作子项关联,同时用事务保证操作原子性:
use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; $validatedData = $request->validate([ 'id' => 'bail|integer', 'code' => 'bail|integer', 'name' => 'bail|required|string|max:255', 'child' => 'bail|array', 'child.something' => 'bail|integer', ]); // 拆分父模型字段与子项字段 $parentData = Arr::except($validatedData, 'child'); $childData = $validatedData['child'] ?? []; // 事务确保父、子模型操作要么全部成功,要么全部回滚 DB::transaction(function () use ($parentData, $childData, $request) { // 更新或创建父模型 $parent = Parent::updateOrCreate( ['id' => $request->id, 'code' => $request->code], $parentData ); // 通过关联直接更新/创建子项(假设为一对一关联) if (!empty($childData)) { $parent->child()->updateOrCreate( ['parent_id' => $parent->id], $childData ); } });
关键细节
- 字段拆分:必须从验证数据中剔除
child字段,避免父模型批量赋值时因不存在对应数据库字段报错。 - 关联定义:确保父模型
Parent已正确声明关联:// Parent.php public function child() { return $this->hasOne(Child::class); } - 子模型可填充:子模型
Child需设置允许批量赋值的字段:// Child.php protected $fillable = ['something', 'parent_id'];
如果是一对多关联(父模型对应多个子项),只需调整验证规则为child.*.something,并将关联操作改为:
// 清空原有子项并批量创建新子项(可根据需求选择sync/attach等方法) $parent->children()->delete(); $parent->children()->createMany($validatedData['child']);
内容的提问来源于stack exchange,提问作者peterhillie
相关产品推荐
相关产品推荐

