我的验证规则是......
$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(),我可以找到我的问题(参见实际的原始查询)。
我显然在这里遗漏了一些东西 - 非常感谢任何帮助!
答案 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