Laravel规则::独一无二,无法按预期工作



这是我的迁移:

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

这是我的自定义请求:

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

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

更新
我的输入是OFFER 2020OFFER-2020是变换后的值。我以为laravel在用OFFER-2020检查唯一性。相反,它通过and查询同时检查OFFER 2020OFFER-2020。这就是为什么我的独特之处不起作用。

如果您的输入是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'

相关内容

  • 没有找到相关文章

最新更新