验证规则required_if与其他条件(Laravel 5.4)

时间:2017-02-18 20:24:06

标签: php laravel validation laravel-5.4 validationrules

我遇到了嵌套条件验证规则的问题。

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',
                ];
        }
}

确实我想: - 仅当type_id等于3时才检查external_id - 并检查它是否为整数。

当我发布表单时,当我选择一个等于3的type_id时,规则会起作用。 但是,如果我选择另一个type_id,如1或2,则验证不会通过:

  

external_id必须是整数。

我尝试添加可空的条件,但required_if不再起作用

你有什么想法吗?

4 个答案:

答案 0 :(得分:4)

您的规则执行两项彼此独立的检查;仅仅因为external_id!= 3时不需要type_id字段,并不意味着忽略整数检查。

您正在寻找的是conditional rule,它可让您更好地控制何时执行检查,例如:

$validator = Validator::make($data, [
    'type_id'   => 'required|integer'
]);

$validator->sometimes('external_id', 'required|integer', function($input) {
    return $input->type_id == 3;
});

使用表单验证时,您可以通过覆盖getValidatorInstance()方法来访问基础验证程序实例:

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;
        }
}

答案 1 :(得分:2)

刚刚遇到同样的问题,发现以下答案似乎对我有用:

issue-using-required-if-validation-rule-in-form-builder

     return [
                'type_id'     => 'required|integer',
                'external_id' => 'required_if:type_id,==,3|nullable|integer',
            ];

我的结果:

字段未填充,类型ID不是3 - 传递

字段未填充,输入id 3 - fail - required field

字段已填充,类型为id 3,非整数 - 整数规则失败

填写

字段,输入id 3,整数 - 传递 - 全部好!

注意 - 认为可以为Nullable的规则出现在Laravel 5.3中

答案 2 :(得分:1)

试试这个,

| productId | type      | size |P_id
 | 123       | container | 20   |123
 | 123       | pallet    | 50   |123

答案 3 :(得分:0)

试试这个 直接传值 参考:https://www.npmjs.com/package/validatorjs

“required_if:anotherfield,value”

如果 anotherfield 字段等于任何值,则验证中的字段必须存在且不为空。

'type_id' => '必需|整数', 'external_id' => 'required_if:type_i,3|整数',