Laravel Validation Rules If Value Exists in Another Field Array Laravel Validation Rules If Value Exists in Another Field Array php php

Laravel Validation Rules If Value Exists in Another Field Array


Haven't tried that, but in general array fields you usually write like this: program.*, so maybe something like this will work:

  $validator = Validator::make($request->all(),[        'program'           => 'required',        'music_instrument'  => 'required_if:program.*,in:Music'  ]);

If it won't work, obviously you can do it also in the other way for example like this:

$rules = ['program' => 'required'];if (in_array('Music', $request->input('program', []))) {    $rules['music_instrument'] = 'required';}$validator = Validator::make($request->all(), $rules);


You could create a new custom rule called required_if_array_contains like this...

In app/Providers/CustomValidatorProvider.php add a new private function:

/** * A version of required_if that works for groups of checkboxes and multi-selects */private function required_if_array_contains(): void{    $this->app['validator']->extend('required_if_array_contains',        function ($attribute, $value, $parameters, Validator $validator){            // The first item in the array of parameters is the field that we take the value from            $valueField = array_shift($parameters);            $valueFieldValues = Input::get($valueField);            if (is_null($valueFieldValues)) {                return true;            }            foreach ($parameters as $parameter) {                if (in_array($parameter, $valueFieldValues) && strlen(trim($value)) == 0) {                    // As soon as we find one of the parameters has been selected, we reject if field is empty                    $validator->addReplacer('required_if_array_contains', function($message) use ($parameter) {                        return str_replace(':value', $parameter, $message);                    });                    return false;                }            }            // If we've managed to get this far, none of the parameters were selected so it must be valid            return true;        });}

And don't forget to check there is a use statement at the top of CustomValidatorProvider.php for our use of Validator as an argument in our new method:

...use Illuminate\Validation\Validator;

Then in the boot() method of CustomValidatorProvider.php call your new private method:

public function boot(){    ...    $this->required_if_array_contains();}

Then teach Laravel to write the validation message in a human-friendly way by adding a new item to the array in resources/lang/en/validation.php:

return [    ...    'required_if_array_contains' => ':attribute must be provided when ":value" is selected.',]

Now you can write validation rules like this:

public function rules(){    return [        "animals": "required",        "animals-other": "required_if_array_contains:animals,other-mamal,other-reptile",    ];}

In the above example, animals is a group of checkboxes and animals-other is a text input that is only required if the other-mamal or other-reptile value has been checked.

This would also work for a select input with multiple selection enabled or any input that results in an array of values in one of the inputs in the request.


I know this post is older but if someone came across this issue again.

$validator = Validator::make($request->all(),[    'program' => 'required',    'music_instrument'  => 'required_if:program,Music,other values']);