首页 > 解决方案 > Laravel 5.4 中的唯一验证无法按 where() 语句的预期工作

问题描述

在此表中,有 3 个主要参数:

"is_active" (BOOLEAN)
"position" (INT)
"id" 

这是唯一规则

'position' => [
'required_if:is_active,true|integer|min:1',
Rule::unique('tablename')->where(function($query) { $query->where('is_active', '=', 'true')->where('id', '!=', $this->id); }),
],

此规则应该确保参数在已设置为position的数据中唯一。当前的问题是该规则已被忽略,并且我能够保存更新/编辑功能,即使按理说应该没有通过此验证。is_activetrue

id=1,位置=1,is_active=true

id=2,位置=2,is_active=true

当我将位置从 2 更改为 1 时,如上所示,它应该显示一条错误消息,而不是成功。但事实并非如此。

编辑:$this属性

ParameterBag {#1862
  #parameters: array:13 [
    "is_active" => "1"
    "order" => "2"
  ]
}

注意:这是在 Laravel 5.4 中,请不要建议我升级到 Laravel 8 等。

标签: phplaravelvalidationlaravel-5

解决方案


我假设,$this->id您使用的是id参数中可用的。

所以,你可以通过两种方式实现

  1. 使用唯一的验证规则,例如... https://laravel.com/docs/5.4/validation#rule-unique
'position' => [
    'required_if:is_active,true|integer|min:1',
    'unique:tablename,columnname,yourIDvalue',
],
  1. 你可以use在函数中使用,像这样......
'position' => [
    'required_if:is_active,true|integer|min:1',
    Rule::unique('tablename')->where(function($query) use ($yourIDvalue) {
        $query->where('is_active', '=', 'true')->where('id', '!=', $yourIDvalue);
    }),
],


推荐阅读