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

Laravel自定义FormRequest新增更新共用时如何让unique规则排除当前行

问题解决方案

你可以通过动态判断当前请求的类型,为新增和更新场景生成不同的校验规则,具体调整如下:

1 修正逻辑说明

你原有规则存在两个问题:

  • unique规则的忽略参数应该传入要跳过的记录主键ID,而非isbn13本身
  • 静态写死的规则无法适配新增、更新两种场景,需要根据请求方法动态拼接规则

2 调整后的完整代码

class BookRequest extends FormRequest {
    public function rules()
    {
        // 先定义公共基础规则
        $baseRules = [
            'isbn13' => ['required', 'digits:13']
        ];

        // 新增场景(POST请求):校验全表isbn13唯一
        if ($this->isMethod('post')) {
            $baseRules['isbn13'][] = 'unique:App\Models\Product,isbn13';
        }

        // 更新场景(PUT/PATCH请求):忽略当前要修改的记录,避免重复报错
        if ($this->isMethod('put') || $this->isMethod('patch')) {
            // 假设路由为 /books/{book} 形式,通过隐式模型绑定获取当前要更新的产品ID
            $currentProductId = $this->route('book')->id;
            // 拼接忽略当前记录的unique规则
            $baseRules['isbn13'][] = 'unique:App\Models\Product,isbn13,' . $currentProductId;
        }

        return $baseRules;
    }
}

3 补充说明

  • 如果你的路由参数名不是book,比如为{product},请将$this->route('book')替换为$this->route('product')
  • 如果你没有使用隐式模型绑定,而是将记录ID放在请求参数中传递,可以用$this->input('id')获取要更新的记录ID
  • 你也可以使用Rule类实现更清晰的写法,可读性更高:
// 顶部先引入Rule类
use Illuminate\Validation\Rule;

// 更新场景的unique规则可改写为
$baseRules['isbn13'][] = Rule::unique('products', 'isbn13')->ignore($currentProductId);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:18:03