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']);