我有一个视图,该视图显示具有与用户模型相关的预填充数据的表单。这用于更新模型数据。但是,提交表单时会发生冲突,因为电子邮件地址不是唯一的(如果尚未更改)。但是我仍然希望能够存储它(或忽略它)。
我正在尝试使用以下控制器代码更新模型:
$input = Input::all();
$validator = Validator::make($input, User::$rules['edit']);
if ($validator->fails()) {
return Response::json(array(
'error' => $validator->messages()
));
}
Run Code Online (Sandbox Code Playgroud)
在模型中,我得到:
public static $rules = array(
'create' => array(
'email' => 'required|email|unique:users',
'password' => 'required|confirmed',
'firstname' => 'required',
'lastname' => 'required',
'address_one'=> 'required',
'postcode'=> 'required'
),
'edit' => array(
'email' => 'sometimes|required|email|unique:users',
'password' => 'sometimes|required|confirmed'
),
);
Run Code Online (Sandbox Code Playgroud)
但是当我更新时,我收到错误消息:
"error": {
"email": [
"The email has already been taken."
]
}
Run Code Online (Sandbox Code Playgroud)
我以为那sometimes会停止这种行为。我究竟做错了什么?
您需要指定用户标识,以便验证器知道在检查条目的唯一性时需要忽略具有该标识的条目:
'email' => 'sometimes|required|email|unique:users,' . $id
Run Code Online (Sandbox Code Playgroud)
取自Laravel文件:
强制使用唯一规则忽略给定的ID
Run Code Online (Sandbox Code Playgroud)'email' => 'unique:users,email_address,10'
在您的情况下,由于您将规则保留在模型属性中,因此需要在将规则传递给验证器之前附加ID。这样的事情应该做:
$input = Input::all();
$rules = User::$rules['edit'];
// this assumes the user your want to update
// is stored in the $user variable
$rules['email'] .= ',' . $user->id;
$validator = Validator::make($input, $rules);
if ($validator->fails()) {
return Response::json(array(
'error' => $validator->messages()
));
}
Run Code Online (Sandbox Code Playgroud)