【问题标题】:How do I make one of the several fields required?如何使几个必填字段之一?
【发布时间】:2018-06-08 08:19:06
【问题描述】:

我的 Eloquent 模型包含 30 个字段。

验证规则:

  1. 第一个字段是必填
  2. 在其他 29 个字段中,至少有一个字段是必填

查看 Laravel 5.5 的文档,我发现 required_without_all 验证规则非常相关。编写上述验证规则的一种方法是在 29 个字段中的每个字段中指定 required_without_all:field1,.....,field28(即除第一个字段和给定字段之外的其他字段)

但是,这需要在除第一个字段之外的所有字段的验证规则中写入 28 个字段名称。有没有更简单、非冗余的方法?

【问题讨论】:

    标签: php laravel validation laravel-validation


    【解决方案1】:

    您仍然可以使用required_without_all,但为了保持它的可维护性,您可以在相关的Request 类中执行类似的操作:

    public function rules()
    {
        $rules = [
            'name' => 'required',
            'email' => 'required|email'
        ];
    
        $fields = collect(['field1', 'field2', ...., 'field29']);
    
        foreach ($fields as $field) {
            $rules[$field] = 'required_without_all:' . implode(',', $fields->whereNotIn(null, [$field])->toArray());
        }
    
        return $rules;
    }
    

    【讨论】:

    • 虽然上面的代码有效,但我对它做了些许改动,因为我对其他 29 个字段有更多规则。我将此行更改为$rules[$field].= '|required_without_all:' . implode(',', $fields->whereNotIn(null, [$field])->toArray()); 更改后,它不再工作了。我对这些字段的规则是'sometimes|date_format:Y-m-d' 是否与something 规则有关?
    【解决方案2】:

    使用after validation hook

    $validator = Validator::make($request->all(), [
        'field1' => 'required',
    ]);
    
    $validator->after(function ($validator) {
        if ( !$this->additionalRule()) {
            $validator->errors()->add('field2', 'At least one additional field has to be set!');
        }
    });
    
    if ($validator->fails()) {
        //
    }
    

    在 additionalRule() 方法中,您可以输入如下内容:

    if (isset($field2, field3,...field29)) {// at least one field is set
        return !empty($field2 || field3 || ... || field29);
    }
    
    return false;
    

    【讨论】:

    • additionalRule()方法应该在哪里定义?
    • 如果你不使用自定义请求类,那么在控制器中。您可以将其设为受保护或私有。
    • 我已经在控制器本身中定义了方法。那么,如何直接使用$field1,$field2,会抛出$field1.....are undefined的错误?
    • 传递 Request $request 实例作为参数。
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2023-04-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多