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

Laravel中实现多表单数据批量插入至关联数据库表

批量插入关联表数据解决方案

1. 确认模型与关联关系

先确保你已创建对应Eloquent模型并设置好关联:

ProgramVaksin 模型(对应program_vaksins表)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class ProgramVaksin extends Model
{
    protected $fillable = ['nama_program'];

    public function programDetails(): HasMany
    {
        return $this->hasMany(ProgramDetail::class);
    }
}

ProgramDetail 模型(对应program_details表)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class ProgramDetail extends Model
{
    protected $fillable = ['program_vaksin_id', 'umur', 'detail_program'];

    public function programVaksin(): BelongsTo
    {
        return $this->belongsTo(ProgramVaksin::class);
    }
}

2. 控制器处理逻辑

在控制器中按以下步骤处理请求:

步骤1:验证请求数据

先对提交的数据做合法性校验:

$validated = $request->validate([
    'nama_program' => 'required|string|max:255',
    'umur' => 'required|array',
    'umur.*' => 'required|integer',
    'detail_program' => 'required|array',
    'detail_program.*' => 'required|string',
]);

步骤2:插入主表数据

创建program_vaksins记录并获取模型实例:

$programVaksin = ProgramVaksin::create([
    'nama_program' => $validated['nama_program'],
]);

步骤3:准备子表批量插入数据

将umur和detail_program数组组合成符合子表结构的数组,同时关联主表ID:

$details = [];
foreach ($validated['umur'] as $index => $umur) {
    $details[] = [
        'program_vaksin_id' => $programVaksin->id,
        'umur' => $umur,
        'detail_program' => $validated['detail_program'][$index],
    ];
}

注:如果表使用Laravel自动时间戳,无需手动添加created_at和updated_at,模型会自动处理。

步骤4:批量插入子表数据

用insert()方法批量插入,效率比循环创建单个实例更高:

ProgramDetail::insert($details);

3. 完整控制器示例

namespace App\Http\Controllers;

use App\Models\ProgramVaksin;
use App\Models\ProgramDetail;
use Illuminate\Http\Request;

class ProgramVaksinController extends Controller
{
    public function store(Request $request)
    {
        // 数据验证
        $validated = $request->validate([
            'nama_program' => 'required|string|max:255',
            'umur' => 'required|array',
            'umur.*' => 'required|integer',
            'detail_program' => 'required|array',
            'detail_program.*' => 'required|string',
        ]);

        // 创建主表记录
        $programVaksin = ProgramVaksin::create([
            'nama_program' => $validated['nama_program'],
        ]);

        // 组装子表数据
        $details = [];
        foreach ($validated['umur'] as $index => $umur) {
            $details[] = [
                'program_vaksin_id' => $programVaksin->id,
                'umur' => $umur,
                'detail_program' => $validated['detail_program'][$index],
            ];
        }

        // 批量插入子表
        ProgramDetail::insert($details);

        return redirect()->back()->with('success', '数据批量插入成功');
    }
}

4. 注意事项

  • 确保program_details表存在program_vaksin_id外键,关联program_vaksins表的id字段。
  • 可添加校验确保umur和detail_program数组长度一致,避免数据错位。
  • insert()方法不会触发模型的created/updated事件,若需触发事件,可改用循环调用create(),但效率会略低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:45:22