Laravel 9中如何同时创建并更新不同数据表的数据
问题修复方案
你的代码存在语法和逻辑问题,以下是具体修复方案及问题说明:
错误点梳理
- update方法语法错误:更新床状态时,你用了比较运算符
==,正确的数组键值对应该使用=>。 - 模型类名大小写错误:Laravel模型类名通常首字母大写(如
Pasien、Bed),小写的pasien和bed可能导致类找不到的报错。 - 未处理床不存在的情况:如果传入的
id_bed对应的床不存在,find()会返回null,直接调用update()会抛出异常。 - 缺少id_bed的有效性验证:没有验证传入的床ID是否存在于beds表中,可能导致无效数据存入pasiens表。
- 日期赋值冗余:
date(now())可简化为now(),Laravel会自动处理日期格式。
修复后的完整代码
public function store(Request $request) { $request->validate([ 'nama' => 'required', 'jk' => 'required', 'alamat' => 'required', 'nik' => 'required|unique:pasiens', 'no_telp' => 'required|unique:pasiens', 'no_rm' => 'required|unique:pasiens|max:8', 'status' => 'required', 'id_bed' => 'required|exists:beds,id' // 新增验证,确保床ID有效 ]); // 使用首字母大写的模型类名 $pasien = Pasien::create([ 'nama' => $request->nama, 'jk' => $request->jk, 'alamat' => $request->alamat, 'nik' => $request->nik, 'no_telp' => $request->no_telp, 'tgl_masuk' => now(), // 简化日期赋值 'no_rm' => $request->no_rm, 'status' => $request->status, 'id_bed' => $request->id_bed ]); // 先检查床是否存在,再执行更新 $bed = Bed::find($request->id_bed); if ($bed) { $bed->update([ 'status_bed' => 1 // 修正为正确的键值对语法 ]); } return back()->with('berhasil', 'Data telah ditambahkan'); }
额外优化建议
为保证数据一致性,建议使用数据库事务,若其中一步失败则回滚所有操作:
use Illuminate\Support\Facades\DB; // 包裹事务逻辑 DB::beginTransaction(); try { $pasien = Pasien::create([ 'nama' => $request->nama, 'jk' => $request->jk, 'alamat' => $request->alamat, 'nik' => $request->nik, 'no_telp' => $request->no_telp, 'tgl_masuk' => now(), 'no_rm' => $request->no_rm, 'status' => $request->status, 'id_bed' => $request->id_bed ]); $bed = Bed::find($request->id_bed); if ($bed) { $bed->update(['status_bed' => 1]); } DB::commit(); return back()->with('berhasil', 'Data telah ditambahkan'); } catch (\Exception $e) { DB::rollBack(); return back()->with('gagal', 'Gagal menambahkan data: ' . $e->getMessage()); }
内容的提问来源于stack exchange,提问作者Febryan Akhdani
相关产品推荐
相关产品推荐

