Laravel 8更新操作时校验数据是否不存在于数据库的实现问题
Laravel 8 会员更新场景字段重复校验实现方案
原有代码问题梳理
- 你定义的
$no/$plat1/$plat2仅构造了查询语句,没有执行查询取字段值,!($no == $request->nokartu)判断逻辑完全失效 - 手动写判断冗余度高,容易漏判需唯一的字段,查询效率也较低
方案一:使用Laravel内置验证器(推荐)
Laravel的unique验证规则天然支持更新场景下排除当前记录,代码更简洁易维护:
public function update(Request $request ) { // 放在方法最开头先做参数校验 $validated = $request->validate([ // unique规则格式:unique:表名,字段名,要忽略的记录ID 'nokartu' => 'required|unique:member,nokartu,'.$request->id, 'nopol' => 'required|unique:member,nopol,'.$request->id, // 若nopol2允许为空则加nullable规则 'nopol2' => 'nullable|unique:member,nopol2,'.$request->id, // 其他字段校验规则可按需补充 'nama' => 'required', 'awal' => 'required|date', 'akhir' => 'required|date|after:awal' ], [ // 自定义错误提示 'nokartu.unique' => 'Kartu sudah dipakai', 'nopol.unique' => 'Nomor polisi sudah dipakai', 'nopol2.unique' => 'Nomor polisi 2 sudah dipakai' ]); // 校验通过后直接批量赋值更新 $data = member::findOrFail($request->id); $data->fill($validated)->save(); return redirect('/member')->with(['success' => 'Data berhasil di simpan']); }
方案二:手动校验逻辑修正版
如果需要保留原有手写判断的写法,修正后代码如下:
public function update(Request $request ) { $data = member::findOrFail($request->id); // 校验卡号是否重复:只有提交值和原有值不同时才查库 if ($request->nokartu != $data->nokartu) { // 用exists()替代count()>0,查询效率更高 if (member::where('nokartu', $request->nokartu)->exists()) { $produk = DB::table('produk')->get(); return view('member.edit', compact('produk', 'data'))->withMessage('Kartu sudah dipakai'); } } // 同理校验车牌号1 if ($request->nopol != $data->nopol) { if (member::where('nopol', $request->nopol)->exists()) { $produk = DB::table('produk')->get(); return view('member.edit', compact('produk', 'data'))->withMessage('Nomor polisi sudah dipakai'); } } // 校验车牌号2 if ($request->nopol2 != $data->nopol2) { if (member::where('nopol2', $request->nopol2)->exists()) { $produk = DB::table('produk')->get(); return view('member.edit', compact('produk', 'data'))->withMessage('Nomor polisi 2 sudah dipakai'); } } // 赋值保存 $data->fill($request->all())->save(); return redirect('/member')->with(['success' => 'Data berhasil di simpan']); }
修正说明
- 直接复用已查询出的会员模型原有字段值做对比,避免冗余查询
exists()方法仅判断是否存在匹配记录,无需统计总数,查询性能更优- 修复了原逻辑中查询构造器和字段值直接比较的错误
内容的提问来源于stack exchange,提问作者Muhammad Ilham
相关产品推荐
相关产品推荐

