phplaravelvalidationlaravel-5.4validationrules

Validation rules required_if with other condition (Laravel 5.4)


I got a problem with validation rules with nested conditions.

class StoreRequest extends Request
{
        public function authorize(){
        return true;
        }

        public function rules(){
                return [
                    'type_id'     => 'required|integer',
                    'external_id' => 'required_if:type_id,==,3|integer',
                ];
        }
}

Indeed I want to : - check the external_id only if the type_id equal to 3 - and check if it's an integer.

When I post my form, the rules works when I select a type_id equal to 3. But if I select another type_id, like 1 or 2, the validation does not pass :

The external_id must be an integer.

I try to add the nullable condition but required_if does not work anymore

Did you have any idea ?


Solution

  • Your rule performs two checks that are independent of one another; just because the external_id field is not required when the type_id != 3, does not mean the integer check is ignored.

    What you are looking for is a conditional rule, which gives you finer control of when to perform a check, e.g. :

    $validator = Validator::make($data, [
        'type_id'   => 'required|integer'
    ]);
    
    $validator->sometimes('external_id', 'required|integer', function($input) {
        return $input->type_id == 3;
    });
    

    When using form validation, you can access the underlying validator instance by overriding the getValidatorInstance() method:

    class StoreRequest extends Request
    {
            public function authorize(){
            return true;
            }
    
            public function rules(){
                    return [
                        'type_id'     => 'required|integer'
                    ];
            }
    
            protected function getValidatorInstance() {
                $validator = parent::getValidatorInstance();
                $validator->sometimes('external_id', 'required|integer', function($input) {
                    return $input->type_id == 3;
                });
                return $validator;
            }
    }