首页 > 解决方案 > Laravel Rule::unique 没有按预期工作

问题描述

这是我的迁移:

Schema::create('coupons', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name')->unique();
});

这是我的自定义请求:

use Illuminate\Validation\Rule;

public function rules()
{
    return [
        'name' => [
            'required', 'string',
            Rule::unique('coupons')
            ->where(function ($q) {
                $q->where('name', 'OFFER-2020');
            })
    ]
}

我正在尝试阻止name数据库表中已存在优惠券字段的请求。由于表中OFFER-2020已经存在行coupons,它应该阻止请求而不是通过验证。

更新
我的输入是OFFER 2020. OFFER-2020是转化后的价值。我认为 laravel 正在检查唯一性OFFER-2020。相反,它同时通过查询OFFER 2020和查询进行检查。这就是为什么我的独特功能不起作用的原因。OFFER-2020and

标签: laravellaravel-6.2

解决方案


如果你输入的是OFFER-2020. 您只需要设置正确的列名,这是唯一规则的第二个参数。这将检查优惠券表中与输入名称相同的行。

Rule::unique('coupons', 'name')

为了使您的输入变得更加流畅,您可以使用表单请求方法 prepareForValidation(),这可以转换您的数据。

function prepareForValidation() {
    $this->merge(['name' => Str::slug($this->get('name'))]);
}

为什么上一个版本失败了?正如您在Unique 类中看到的那样。如果您不提供列,它将默认为 id。因此,您之前的查询最终会看起来与此类似。

select * from coupons where id = 'OFFER-2020' and name = 'OFFER-2020'

推荐阅读