【问题标题】:Laravel Rule::unique not working as expectedLaravel Rule::unique 没有按预期工作
【发布时间】:2020-04-01 10:27:53
【问题描述】:

这是我的迁移:

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 的唯一性。相反,它通过and 查询同时检查OFFER 2020 和OFFER-2020。这就是为什么我的独特功能不起作用的原因。

【问题讨论】:

  • 您能描述一下您实际尝试实现的验证吗?
  • 我正在尝试阻止数据库表中已存在优惠券“名称”字段的请求
  • 请定义什么不起作用?您如何使用表单请求或内联验证的规则也应包含在问题中。
  • 名字的输入是OFFER-2020?老实说,您的查询将其静态化是没有意义的
  • 但它不应该工作吗?我在数据库表中有这个“名字”。为什么硬编码值不起作用?

标签: laravel laravel-6.2


【解决方案1】:

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

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'

【讨论】:

  • 感谢prepareForValidation!我爱你:)
猜你喜欢
  • 2018-08-27
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2015-10-30
  • 2015-11-09
相关资源
最近更新 更多