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
相关产品推荐
相关产品推荐

