如何制作所需的几个字段之一?
How do I make one of the several fields required?
我的 Eloquent 模型包含 30 个字段。
验证规则:
- 第一个字段必填
- 在其他 29 个字段中,至少有一个字段是必需的。
查看 Laravel 5.5 的文档,我发现 required_without_all
验证规则非常相关。编写上述验证规则的一种方法是在 29 个字段中的每个字段中指定 required_without_all:field1,.....,field28
(即除第一个和给定字段之外的其他字段)
但是,这需要在除第一个字段之外的所有字段的验证规则中写入28个字段名称。有没有更简单、非冗余的方法?
您仍然可以使用 required_without_all
,但为了保持它的可维护性,您可以在相关 Request
class:
中执行类似的操作
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;
}
$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;
我的 Eloquent 模型包含 30 个字段。
验证规则:
- 第一个字段必填
- 在其他 29 个字段中,至少有一个字段是必需的。
查看 Laravel 5.5 的文档,我发现 required_without_all
验证规则非常相关。编写上述验证规则的一种方法是在 29 个字段中的每个字段中指定 required_without_all:field1,.....,field28
(即除第一个和给定字段之外的其他字段)
但是,这需要在除第一个字段之外的所有字段的验证规则中写入28个字段名称。有没有更简单、非冗余的方法?
您仍然可以使用 required_without_all
,但为了保持它的可维护性,您可以在相关 Request
class:
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;
}
$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;