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

Laravel表单请求自定义验证问题:已删除SKU校验失效

解决软删除产品SKU验证规则不生效及提示文案问题

问题梳理

需要为带软删除的products表SKU字段添加验证:当提交的SKU已存在且对应deleted_at不为空(即已被软删除)时,返回中文提示「该SKU已创建,请恢复已删除数据」,但当前自定义验证规则未生效,且提示仍为英文。

错误分析

  1. 验证逻辑倒置:自定义规则的passes方法返回true代表验证通过,但当前逻辑是「SKU存在且已被软删除时验证通过」,与需求的「该场景下验证失败并提示」完全相反。
  2. 表单请求规则语法错误:sku字段的规则数组未正确包含unique规则,导致规则解析异常。
  3. 提示文案未替换:规则的message方法仍返回英文,未改为需求的中文提示。

修复步骤

1. 修正自定义验证规则类

调整逻辑,当SKU存在且已被软删除时,passes方法返回false(触发验证失败),同时替换提示文案:

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\Rule;
use App\Models\Product;

class SkuDeletedValidationRule implements Rule
{
    public function passes($attribute, $value)
    {
        // 当SKU存在且deleted_at不为空(已被软删除)时,验证失败
        return !\DB::table('products')
            ->where('sku', $value)
            ->whereNotNull('deleted_at')
            ->exists();
    }

    public function message()
    {
        return '该SKU已创建,请恢复已删除数据';
    }
}

2. 修正表单请求的SKU规则

将unique规则正确放入sku的规则数组中,避免语法错误:

public function rules(): array
{
    return [
        'name' => 'required',
        'sku' => [
            'required',
            new SkuDeletedValidationRule,
            'unique:products,sku,' . $this->product?->id
        ],
        'sku_merchant' => 'nullable|unique:products,sku_merchant,' . $this->product?->id,
        'slug' => 'nullable',
        'is_publish' => 'required',
        'price' => 'required',
        'description' => 'required',
        'discount' => 'nullable',
        'images.*' => 'required',
        'category.*' => 'nullable|exists:categories,id',
        'supplier_id' => 'required',
        'buyer_price' => 'required'
    ];
}

额外说明

如果你的需求是「仅允许使用已被软删除的SKU」(即SKU不存在或未被删除时验证失败),则passes方法无需取反,保持原逻辑即可,但此时提示文案需对应调整为「该SKU未被删除或不存在」,根据实际业务场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:07:08