Laravel Rule::unique 未按预期工作
Laravel Rule::unique not working as expected
这是我的迁移:
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
字段已存在于数据库 table 中的请求。由于 OFFER-2020
行已经存在于 coupons
table 中,它应该阻止请求而不是通过验证。
更新
我的输入是 OFFER 2020
。而OFFER-2020
是变换后的值。我认为 laravel 正在使用 OFFER-2020
检查唯一性。相反,它通过 and
查询同时检查 OFFER 2020
和 OFFER-2020
。这就是为什么我的 unique 不起作用。
如果你输入的是OFFER-2020
。您只需要设置正确的列名,这是唯一规则的第二个参数。这将检查优惠券 table,查找与输入同名的行。
Rule::unique('coupons', 'name')
为了使您的输入更流畅,您可以使用表单请求方法 prepareForValidation(),这可以转换您的数据。
function prepareForValidation() {
$this->merge(['name' => Str::slug($this->get('name'))]);
}
为什么之前的版本失败了?正如您在 Unique class 中看到的那样。如果您不提供列,它将默认为 id。所以你之前的查询最终会看起来与此类似。
select * from coupons where id = 'OFFER-2020' and name = 'OFFER-2020'
这是我的迁移:
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
字段已存在于数据库 table 中的请求。由于 OFFER-2020
行已经存在于 coupons
table 中,它应该阻止请求而不是通过验证。
更新
我的输入是 OFFER 2020
。而OFFER-2020
是变换后的值。我认为 laravel 正在使用 OFFER-2020
检查唯一性。相反,它通过 and
查询同时检查 OFFER 2020
和 OFFER-2020
。这就是为什么我的 unique 不起作用。
如果你输入的是OFFER-2020
。您只需要设置正确的列名,这是唯一规则的第二个参数。这将检查优惠券 table,查找与输入同名的行。
Rule::unique('coupons', 'name')
为了使您的输入更流畅,您可以使用表单请求方法 prepareForValidation(),这可以转换您的数据。
function prepareForValidation() {
$this->merge(['name' => Str::slug($this->get('name'))]);
}
为什么之前的版本失败了?正如您在 Unique class 中看到的那样。如果您不提供列,它将默认为 id。所以你之前的查询最终会看起来与此类似。
select * from coupons where id = 'OFFER-2020' and name = 'OFFER-2020'