Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel profile update with e-mail unique:users

Tags:

laravel

I'm new in Laravel. I try to make profile update page... all works good but if I try to apply rule to set email field unique:users I have problem when user try to update for example name and don't want change email.

public function rules()
{
    return [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
    ];
}

I want restrict that user to use the same e-mail that someone else is using... but I want to ignore that if this is the same e-mail already in that user profile and he don't want to change that.

public function updateData(UpdateDataRequest $request)
{
    DB::table('users')
        ->where('id', Auth::user()->id)
        ->update(array('email' => $request->email, 'name' => $request->name));

    return redirect('panel');
}

How to do it right?

like image 243
Krystus Avatar asked Jan 15 '16 20:01

Krystus


2 Answers

This exact situation is used as an example in the docs.

https://laravel.com/docs/5.2/validation#rule-unique

Forcing A Unique Rule To Ignore A Given ID:

Sometimes, you may wish to ignore a given ID during the unique check. For example, consider an "update profile" screen that includes the user's name, e-mail address, and location. Of course, you will want to verify that the e-mail address is unique. However, if the user only changes the name field and not the e-mail field, you do not want a validation error to be thrown because the user is already the owner of the e-mail address. You only want to throw a validation error if the user provides an e-mail address that is already used by a different user. To tell the unique rule to ignore the user's ID, you may pass the ID as the third parameter:

'email' => 'unique:users,email_address,'.$user->id

If your table uses a primary key column name other than id, you may specify it as the fourth parameter:

'email' => 'unique:users,email_address,'.$user->id.',user_id'
like image 88
ceejayoz Avatar answered Sep 24 '22 19:09

ceejayoz


In new version. laravel using Rules to ignore a user or record

https://laravel.com/docs/5.8/validation#rule-unique

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

$user->id can be a specific id or the id of current user which is login

like image 35
AbdulAhmad Matin Avatar answered Sep 24 '22 19:09

AbdulAhmad Matin