Home > database >  Laraval array validation with unique email while update
Laraval array validation with unique email while update

Time:01-31

Updating form but email should be unique, request('contacts.*.id') is empty. It should have ID of that row. How can i get that ID?

        return [
        'email' => "required|email|unique:clients,email,".request('id'),
        'client_type_text' => 'required',
        'client_name' => 'required',
        'phone_number' => 'required',
        'contacts' => 'required|array',
        'contacts.*.firstname' => 'required',
        'contacts.*.lastname' => 'required',
        'contacts.*.mobile' => 'required',
        'contacts.*.email' => 'required|email|unique:users,email,'.request('contacts.*.id'),
    ];

CodePudding user response:

It should work

return [
            'email' => "required|email|unique:clients,email,".request('id'),
            'client_type_text' => 'required',
            'client_name' => 'required',
            'phone_number' => 'required',
            'contacts' => 'required|array',
            'contacts.*.firstname' => 'required',
            'contacts.*.lastname' => 'required',
            'contacts.*.mobile' => 'required',
            // check if email is unique for each contact id
            'contacts.*.email' => [
                'required',
                'email',
                function ($attribute, $value, $fail) {
                    $contact_id = explode('.', $attribute)[1];
                    $client_id = request('id');
                    $contact = \App\Models\Contact::where('id', $contact_id)->where('client_id', $client_id)->first();
                    if ($contact) {
                        $contact_email = $contact->email;
                        if ($contact_email != $value) {
                            $contact_with_email = \App\Models\Contact::where('email', $value)->first();
                            if ($contact_with_email) {
                                $fail('The email has already been taken.');
                            }
                        }
                    }
                },
            ],
        ];

CodePudding user response:

you can use the unique validation rule in the following way to ensure that the email of each contact is unique in the users table and ignore the id of the contact being updated:

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

the Rule facade is used to create a custom validation rule using the unique method. The ignore method is used to specify the id of the contact to be ignored while checking for the uniqueness of the email. The route function is used to retrieve the input data, including the contacts.*.id field.

  • Related