I have a view that shows a form with pre-populated data related to a user model. This is for updating the model data. When the form is submitted, however, there's a conflict because the email address is not unique (if it hasn't been changed). Yet I still want to be able to store this (or ignore it).
I'm trying to update a model with this controller code:
$input = Input::all();
$validator = Validator::make($input, User::$rules['edit']);
if ($validator->fails()) {
return Response::json(array(
'error' => $validator->messages()
));
}
In the model, I've got:
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'
),
);
But when I update, I get the error message:
"error": {
"email": [
"The email has already been taken."
]
}
I thought that the sometimes
would stop this behaviour. What am I doing wrong?
You need to specify the user ID so the validator knows it needs to ignore the entry with that ID when checking the entries for uniqueness:
'email' => 'sometimes|required|email|unique:users,' . $id
Taken from the Laravel Docs:
Forcing A Unique Rule To Ignore A Given ID
'email' => 'unique:users,email_address,10'
In your case, since you're keeping the rules in a model property, you'll need to append the ID before passing the rules to the validator. Something like this should do:
$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()
));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With