Home > front end >  Using excludes_unless validation rule with arrays in Laravel
Using excludes_unless validation rule with arrays in Laravel

Time:12-04

Laravel's exclude_unless,field,value rule doesn't seem to work in the instance where field is an array of values and value is contained within the field array.

Given the following:

$validator = Validator::make($request->all(), [
    'some_array' => 'array',
    'some_field' => 'exclude_unless:some_array,foo|alpha_num',
]);

Where some_array is equal to ['foo'], the validator will fail to exclude some_field. This seems to be because the comparison that lies beneath excludes_unless is in_array(['foo'], ['foo']) which returns false.

Is it possible to achieve the same logic of exclude_unless — excluding a field from validation if another field equals a certain value, but where the field being compared against is an array and we're checking that the value is in that array?

CodePudding user response:

As long as you're using Laravel 8.55 or above, you could use Rule::when():

use Illuminate\Validation\Rule;

$someArray = $request->input('some_array', []);

$validator = Validator::make($request->all(), [
    'some_array' => 'array',
    'some_field' => Rule::when(!empty(array_intersect(['foo'], $someArray)), ['exclude']),
]);

CodePudding user response:

A closure with a custom rule is what you need:

$validator = Validator::make($request->all(), [
    'some_array' => 'array',
    'some_field' => [
        function($key, $val, $fail) use (&$request) {
            if (array_search('foo', $request->some_array) === false) {
                $request->remove('some_field');
            }
        },
        'alpha_num',
    ],
]);
  • Related