我遇到了带有嵌套条件的验证规则的问题。
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 - 并检查它是否是整数。
当我发布表单时,当我选择 type_id 等于 3 时,规则将起作用。 但如果我选择另一个 type_id,例如 1 或 2,验证不会通过:
external_id 必须是整数。
我尝试添加可为空条件,但 required_if 不再起作用
你有什么想法吗?
刚刚遇到同样的问题,并发现以下答案似乎对我有用:
return [
'type_id' => 'required|integer',
'external_id' => 'required_if:type_id,==,3|nullable|integer',
];
我的结果:
字段未填充,类型 ID 不是 3 - 通过
字段未填充,类型 id 3 - 失败 - 必填字段
已填充字段,类型 id 3,非整数 - 不符合整数规则
字段已填充,类型 id 3,整数 - 通过 - 一切都很好!
注意 - 认为可空规则出现在 Laravel 5.3
您的规则执行两项相互独立的检查;只是因为当
external_id
!= 3 时不需要 type_id
字段,并不意味着忽略整数检查。
您正在寻找的是条件规则,它可以让您更好地控制何时执行检查,例如:
$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;
}
}
试试这个 直接传值 参考:https://www.npmjs.com/package/validatorjs
“required_if:另一个字段,值”
如果另一个字段字段等于任何值,则验证中的字段必须存在且不为空。
'type_id' => 'required|integer',
'external_id' => 'required_if:type_i,3|integer',
我认为最简单的方法是
'type_id' => 'required|integer',
'external_id' => $this->type_id === 3 ? 'required|integer' : 'nullable',
试试这个,
class StoreRequest extends Request
{
public function authorize(){
return true;
}
public function rules(){
return [
'type_id' => 'required|integer',
'external_id' => 'required_if:type_id|in:3|integer',
];
}
}