AntKing
AntKing

Reputation: 39

How to forcing a unique rule to ignore a given id?

While updating the "users" table, I want the EditUserRequest form checkout to ignore the current email because it already exists. Code rules:

public function rules()
{
    return [
        'username' => 'required|max:200',
        'email' =>  [
                        'required',
                        Rule::unique('users')->ignore($user->id),
                    ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ];
}

Code UserController:

public function postEdit($id,EditUserRequest $request)
{
    $user = User::find($id);
    $user->name = $request->username;
    $user->email = $request->email;
    $user->password = Hash::make($request->pass1);
    $user->level = $request->get('cbadmin',0);
    $user->save();
    return view('admin.edit-user')->with('success','Sửa thành công!');
}

This line: 'email' => 'required|email|unique:users,email' will check email exists. However, the default email I need to update it already exists. Did I read:https://laravel.com/docs/5.6/validation#rule-unique. But I do not understand how to solve this problem

Upvotes: 0

Views: 3790

Answers (4)

lagbox
lagbox

Reputation: 50491

I am not sure of your route parameter names since your routes aren't included in the post, so I will assume $id on the controller method means there is a route parameter named id.

'email' =>  [
    'required',
    Rule::unique('users')->ignore($this->route('id')),
],

This would use the id from the route parameter, assuming it was named id. This will tell the rule to ignore the unique check on this email field for this particular User id.

Upvotes: 2

Demonyowh
Demonyowh

Reputation: 1672

you can do this by using the Rule facade ..

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

EDIT

in case you're using a function to validate your inputs you may do it like this:

protected function yourValidatorName(array $data, $id)
{
    return Validator::make($data, [
        'username' => 'required|max:200',
        'email' =>  [
            'required',
             Rule::unique('users')->ignore($id),
        ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ]);
}

then

public function postEdit($id, EditUserRequest $request)
{
    $accountValidate = $this->yourValidatorName($request->all(), $id);
    if (!$accountValidate->fails())
    {
        // success
    }
    else
    {
        // failed
    }
}

Upvotes: 1

aceraven777
aceraven777

Reputation: 4556

Can you show me your route for postEdit?

For example this is your route:

Route::put('users/{user_id_sample}', 'UserController@postEdit');

You may do something like this:

public function rules()
{
    return [
        'username' => 'required|max:200',
        'email' =>  [
                        'required',
                        Rule::unique('users')->ignore($this->route('user_id_sample')),
                    ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ];
}

Upvotes: 1

FULL STACK DEV
FULL STACK DEV

Reputation: 15951

public function rules()
    {
        return [
            'username' => 'required|max:200',
            'email' => 'required|email|unique:users,email,'.request()->user()->id,
            'pass1' => 'required|min:6',
            'pass2' => 'same:pass1',
        ];
    }

You can pass a third parameter as id to ignore.

Hope this helps.

Upvotes: 2

Related Questions