首页 > 解决方案 > 使用必填字段验证非必填关联数组

问题描述

我想验证如果我的请求包含关联数组类型的字段,则该数组需要包含特定字段(但前提是它存在)

即,数组,如果存在,需要包含 foo:

{ data: {}}

{ data: { array: { foo: 1 } }

很好,但是

{ data: { array: {} }

{ data: { array: { bar: 1 } }

不是。

我写了这个验证器:

['data.array' => 'sometimes', 'data.array.foo' => 'required']

但它不接受第一种情况。

>>> \Illuminate\Support\Facades\Validator::make(
   ['data' => []], 
   ['data.array' => 'sometimes', 'data.array.foo' => 'required']
)->errors()->all();
=> [
     "The data.array.foo field is required.",
   ]

我想避免使用'data.array.foo' => 'required_with:data.array'(当数组为空时,它也不适用于场景)

>>> \Illuminate\Support\Facades\Validator::make(
   ['data' => ['array' => []]], 
   ['data.array' => 'sometimes', 'data.array.foo' => 'required_with:data.array']
)->errors()->all();
=> []

是否有任何非自定义验证器可以帮助我完成此任务?

标签: phplaravellaravel-validation

解决方案


你也可以Rule::requiredIf在 Laravel 5.6 及更高版本之后使用,试试这个:

$validator =  Validator::make( $request->input(), [
    // ...
    'data.array.foo'=> Rule::requiredIf( function () use ($request){
        return (bool) $request->input('data.array');
    })
]);

推荐阅读