phplaravelvalidationeloquent

Laravel update model with unique validation rule for attribute


I have a Laravel User model which has a unique validation rule on username and email. In my Repository, when I update the model, I revalidate the fields, so as to not have a problem with required rule validation:

public function update($id, $data) {
    $user = $this->findById($id);
    $user->fill($data);
    $this->validate($user->toArray());
    $user->save();

    return $user;
}

This fails in testing with:

ValidationException: {"username":["The username has already been taken."],"email":["The email has already been taken."]}

Is there a way of fixing this elegantly?


Solution

  • Append the id of the instance currently being updated to the validator.

    1. Pass the id of your instance to ignore the unique validator.

    2. In the validator, use a parameter to detect if you are updating or creating the resource.

    If updating, force the unique rule to ignore a given id:

    //rules
    'email' => 'unique:users,email_address,' . $userId,
    

    If creating, proceed as usual:

    //rules
    'email' => 'unique:users,email_address',