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

更新表单中如何忽略数据库已存列值的唯一性校验?

解决方案

要实现更新时未修改passport字段则跳过unique校验,同时让store和update共用同一个Request类,只需在验证规则中动态调整unique规则,排除当前记录即可。

步骤1:引入Rule类

在JudokaRequest.php顶部引入Laravel的验证规则类:

use Illuminate\Validation\Rule;

步骤2:修改rules方法

将原来的固定unique规则替换为动态规则,利用Rule::unique()->ignore()方法排除当前记录:

public function rules()
{
    return [
        'passaport' => [
            'required',
            'size:8',
            new PassportNumberRule,
            Rule::unique('judokas', 'passaport')->ignore($this->route('judoka')),
        ],
    ];
}

说明

  • 新增场景(store方法):路由中没有绑定Judoka模型实例,$this->route('judoka')返回null,此时ignore(null)不会添加排除条件,规则等价于普通的unique:judokas,passaport,确保新增时passport不重复。
  • 更新场景(update方法):如果你的更新路由使用了模型绑定(比如Route::put('/judokas/{judoka}', [JudokaController::class, 'update'])),$this->route('judoka')会获取到当前要更新的模型实例,ignore()方法会自动排除该实例的ID,此时即使passport字段和原有值一致,也不会触发重复校验;只有当修改为其他已存在的passport值时,才会报错。

兼容非模型绑定的情况

如果你的更新路由没有使用模型绑定,而是通过ID参数传递(比如Route::put('/judokas/{id}', [JudokaController::class, 'update'])),可以直接传递ID给ignore()方法:

Rule::unique('judokas', 'passaport')->ignore($this->route('id'))

内容的提问来源于stack exchange,提问作者user20338917

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:45:38