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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:54:02