user7851085
user7851085

Reputation:

Laravel's unique:users,email validation error shows during edit

I have a form that i am using to edit a user account. I have some validation setup on the email field and i have specified that the email must be unique. The problem is when i submit the form, the validation rule that requires emails to be unique fires. That shouldn't be the case since i am editing the form and i know the email exists.

This is the code

public function servicesAdminEditUser(){
      $id = request('hidden_user_id');
      $rules = array(
          'users_telephone_number' => 'required|unique:users,users_telephone_number',
          'users_email' => 'required|email|unique:users,email',
          'users_full_names' => 'required',
          'users_gender' => 'required',
          'users_credits' => 'required',
          'users_email_verification_status' => 'required',
          'users_number_verification_status' => 'required',
          'users_moderation_status' => 'required',
          'user_role' => 'required',
          'users_profile_picture' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048'
          );

          $customMessages = [
    'users_telephone_number.required' => 'The telephone number is required.',
    'users_email.required' => 'We need a unique email',
    'users_full_names.required'  => 'Your full names are required',
    'users_gender.required'  => 'Gender is required',
    'users_profile_picture.required'  => 'We need your profile picture',
    'users_credits.required'  => 'User Credits Are Required',
    'users_email_verification_status.required'  => 'User email verification status is required',
    'users_number_verification_status.required'  => 'User number verification status is required',
    'users_moderation_status.required'  => 'User moderation status is required',
    'user_role.required'  => 'User role is required',
  ];

      $validator = Validator::make(Input::all(), $rules,$customMessages);
      if ($validator->fails()) {
          $messages = $validator->messages();
          return Redirect::back()->withErrors($validator);
      }
      else {
        if (Input::file('users_profile_picture')->isValid()) {
              $destinationPath = 'uploads';
              $extension = Input::file('users_profile_picture')->getClientOriginalExtension();
              $fileName = time().'_'.rand(11111,99999).'.'.$extension;
              Input::file('users_profile_picture')->move($destinationPath, $fileName);
            }
            else {
            echo 'file not valid';
            }

        $updyt = User::find($id);
        $updyt->email = request('users_email');
        //$reg->password = bcrypt(request('confirm-password'));
        $updyt->users_telephone_number = request('users_telephone_number');
        $updyt->users_email_verification_status = request('users_email_verification_status');
        $updyt->users_number_verification_status = request('users_number_verification_status');
        $updyt->users_full_names = request('users_full_names');
        $updyt->users_gender = request('users_gender');
        $updyt->users_credits = request('users_credits');
        $updyt->users_profile_picture = $fileName;
        $updyt->users_moderation_status = request('users_moderation_status');;
        $updyt->update();
        //$reg->attachRole($value);

        DB::table('role_user')->where('user_id',$id)->delete();
        $updyt->attachRole(Role::where('name',request('user_role'))->first());
        return redirect('servicesUsers');
      }
    }

If i remove the unique rule and it so happens the user editing teh accounts enters an existing email, laravel will display mysql errors that catch duplicates on the browser. How can i fix this?.

Upvotes: 0

Views: 2475

Answers (2)

E. S.
E. S.

Reputation: 2919

If you want to ignore some id (in that case, for an update), you can use the syntax:

unique:table,column,except,idColumn

The field under validation must be unique in a given database table. If the column option is not specified, the field name will be used.

'users_email' => "required|email|unique:users,email,id,{$id}",

I recommend you to create another method for updates, this will make your code cleaner and easier to understand.

Upvotes: 0

Sapnesh Naik
Sapnesh Naik

Reputation: 11636

Try this,

Assuming your email field name in table is email and request input mail field name is users_email and $id is the user's id present in users table.

'users_email' => 'required|email|unique:users,email,'.$id,

Upvotes: 2

Related Questions