Laravel验证:对一个用户不起作用的唯一异常

时间:2017-07-31 14:10:46

标签: laravel validation

我的验证规则是......

$rules = [];

    foreach($this->request->get('email') as $key=>$value){
        $rules['email.'.$key] = 'required|regex:/[a-zA-Z]+@[a-zA-Z]+(\.[a-zA-Z]+)+/|unique:admins,admin_email,'.$this->request->get('admin_id')[$key].',admin_id';
    }

基本上,规则是它是必需的,正则表达式传递,并且电子邮件尚未被使用,除非该电子邮件正由该特定行使用。但是,当我运行表单时,我收到此错误消息:

The email.0 has already been taken.

要清楚,此表单有8个不同的用户,只有第一个给我这个问题。我做了dd()规则,看看正在应用的验证规则之间有什么不同,我没有看到。

"email.0" => "required|regex:/[a-zA-Z]+@[a-zA-Z]+(\.[a-zA-Z]+)+/|unique:admins,admin_email,0,admin_id"

"email.1" => "required|regex:/[a-zA-Z]+@[a-zA-Z]+(\.[a-zA-Z]+)+/|unique:admins,admin_email,1,admin_id"

"email.2" => "required|regex:/[a-zA-Z]+@[a-zA-Z]+(\.[a-zA-Z]+)+/|unique:admins,admin_email,2,admin_id"

如果我更新email.0,我不会遇到这个问题。无论是否更新email.0,我也不会在任何其他行中遇到此问题。由于存在外键约束,我无法删除此用户。要非常清楚,此特定管理员admin_id 0。或者,换句话说,这就是表格查找此特定条目的方式

admin_id|admin_email
--------+------------
   0    |  ab@c.d

编辑:Laravel在哪里构建并运行实际查询?如果我可以在数据库日志上执行dd(),我可以找到我的问题(参见实际的原始查询)。

我显然在这里遗漏了一些东西 - 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

唯一的规则不应该是这样的:

unique:admins,admin_email,0,admin_id

0是指admin_id列的值,唯一规则应忽略该值。

因此,如果您将表格admins设为:

admin_id | admin_email
---------+-------------
1        | a@b.c
2        | b@c.d
3        | c@d.e

您正在更新admin_email == b@c.d

的位置

您的规则应该看起来像

unique:admins,admin_email,2,admin_id