Laravel Eloquent多表插入咨询:会议室预订及邀请人数据存储
用Eloquent完成会议室预订与邀请人员的数据插入
嘿,我来帮你搞定这个Laravel Eloquent的双表插入问题!要实现这个需求,我们需要先搞定模型之间的关联,再在控制器里用事务确保数据一致性,最后完成批量插入。
第一步:定义模型与关联关系
首先,确保你的两个模型(JadwalMeeting和Invite)已经正确创建,并且设置了关联:
1. JadwalMeeting 模型(对应 jadwal_meetings 表)
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class JadwalMeeting extends Model { // 如果表名是 jadwal_meetings,Laravel会自动识别,不用手动指定 protected $fillable = ['nama_meeting', 'tanggal', 'jam_mulai', 'jam_selesai']; // 根据你的实际字段补充 // 一个会议对应多个邀请人员 public function invites(): HasMany { return $this->hasMany(Invite::class); } }
2. Invite 模型(对应 invites 表)
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class Invite extends Model { protected $fillable = ['jadwal_meeting_id', 'nama_peserta', 'email_peserta']; // 根据你的invites表字段调整 // 一个邀请属于一个会议 public function jadwalMeeting(): BelongsTo { return $this->belongsTo(JadwalMeeting::class); } }
第二步:完善控制器的 save_schedule 方法
接下来我们修改控制器代码,加入数据库事务(避免会议数据插入成功但邀请数据插入失败的情况),并利用Eloquent关联来批量插入邀请数据:
<?php namespace App\Http\Controllers; use App\Models\JadwalMeeting; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class YourControllerName extends Controller // 替换成你的实际控制器名 { public function save_schedule(Request $request) { // 第一步:验证请求数据(根据你的实际字段调整规则) $validated = $request->validate([ 'nama_meeting' => 'required|string|max:255', 'tanggal_meeting' => 'required|date', 'jam_mulai' => 'required|date_format:H:i', 'jam_selesai' => 'required|date_format:H:i|after:jam_mulai', 'invites' => 'required|array', // 假设前端传的邀请是数组格式 'invites.*.nama_peserta' => 'required|string|max:255', 'invites.*.email_peserta' => 'required|email|max:255', ]); // 第二步:用事务确保数据一致性 DB::beginTransaction(); try { // 创建会议室预订记录 $meeting = JadwalMeeting::create([ 'nama_meeting' => $validated['nama_meeting'], 'tanggal' => $validated['tanggal_meeting'], 'jam_mulai' => $validated['jam_mulai'], 'jam_selesai' => $validated['jam_selesai'], // 如果有这个字段的话 // 其他需要的字段都在这里补充 ]); // 批量插入邀请人员数据(利用关联关系自动填充jadwal_meeting_id) $meeting->invites()->createMany($validated['invites']); // 如果都成功,提交事务 DB::commit(); // 返回成功响应,比如跳转到列表页或者返回JSON return redirect()->route('meetings.index')->with('success', '会议及邀请已成功保存!'); } catch (\Exception $e) { // 如果出错,回滚事务 DB::rollBack(); // 可以记录错误日志,或者返回错误提示 return back()->with('error', '保存失败:' . $e->getMessage()); } } }
关键要点说明
- 数据库事务:用
DB::beginTransaction()、DB::commit()和DB::rollBack()确保要么两张表都插入成功,要么都不插入,避免数据不一致。 - 关联插入:通过
$meeting->invites()->createMany()自动把jadwal_meeting_id字段填充好,不用手动指定,这比单独插入Invite数据更简洁也更安全。 - 请求验证:一定要先验证前端传过来的数据,避免脏数据存入数据库,同时给用户清晰的错误提示。
- 命名规范:建议遵循Laravel的命名规范,模型名用驼峰式(比如
JadwalMeeting),表名用蛇形复数(比如jadwal_meetings),这样Eloquent可以自动识别关联,不用额外配置。
内容的提问来源于stack exchange,提问作者Bariq Dharmawan
相关产品推荐
相关产品推荐

