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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:53