Home > OS >  Laravel validate array and exclude on specific array value
Laravel validate array and exclude on specific array value

Time:08-05

I have an array of values that I send together with other fields in a form to laravel.

The array contains a role_id field and a status field, the status can be I (Insert) U (update) D (Delete). When I validate the values in the array I want it to skip the ones where the status equals D. Otherwise I want it to validate.

    private function checkValuesUpdate($userid = null)
    {
        return Request::validate(
            [
                'displayname' => 'required',
                'username' => 'required',
                'email' => ['nullable', 'unique:contacts,email' . (is_null($userid ) ? '' : (',' . $userid ))],
                'roles.*.role_id' => ['exclude_if:roles.*.status,D', 'required']
            ]
        );
    }

I can't seem to get it to work. I've been searching all over the place for functional code as well as the Laravel documentation. But no luck so far. Has anybody ever done this?

CodePudding user response:

Your problem comes from a misunderstanding of the exclude_if rule. It doesn't exclude the value from validation, it only excludes the value from the returned data. So it would not be included if you ran request()->validated() to get the validated input values.

According to the documentation, you can use validation rules with array/star notation so using the required_unless rule might be a better approach. (Note there's also more concise code to replace the old unique rule, and I've added a rule to check contents of the role status.)

$rules = [
    'displayname' => 'required',
    'username' => 'required',
    'email' => [
        'nullable',
        Rule::unique("contacts")->ignore($userid ?? 0)
    ],
    'roles' => 'array',
    'roles.*.status' => 'in:I,U,D',
    'roles.*.role_id' => ['required_unless:roles.*.status,D']
];
  • Related