laravel - 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-2020
and
解决方案
如果你输入的是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'
推荐阅读
- flutter - 设置 flutter_localizations 包时出错
- branch.io - Branch io:我应该如何配置链接,以便当用户单击尚未安装的Android应用程序的链接时打开默认应用程序市场?
- postgresql - 来自 Postman 的 Express 错误:列不存在(在 Node、Postgres、Express 中)
- python - 我正在尝试删除前面或后面有空格的数字,但在这种情况下?
- docker - 不运行新的 docker 镜像
- php - WooCommerce 购物车运费计算器仅限于特定州
- c++ - 使用条件编译指令编写一个程序,将数字 56 舍入到最接近的 50
- c - 带指针的复合文字
- flutter - 如何在颤动中将动态文本字段限制为 4?
- sass - 我想在 VS2019 中使用 Web 编译器编译位于文件夹中的所有 *.scss 文件