如何制作所需的几个字段之一?

问题描述 投票:6回答:2

我的Eloquent模型由30个字段组成。

验证规则:

  1. 第一个字段是必需的
  2. 在其他29个字段中,至少需要一个字段。

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

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

php laravel validation laravel-validation
2个回答
3
投票

您仍然可以使用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;
}

3
投票

使用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;
© www.soinside.com 2019 - 2024. All rights reserved.