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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:15:37