我想在 start_po_no
值为 1 且 required_if
字段值为 1 时进行 digits_between
验证(po_type
和 use_spo
)。
现在,我在请求文件中编写了验证规则,如下所示:
public function rules()
{
return [
'use_spo' => 'required',
'po_type' => 'required',
'start_po_no' => Rule::requiredIf(function () use ($supplierPoUse, $generatePo) {
return request("use_spo") == 1 && request("po_type") == 1;
}).'|digits_between:1,9',
];
}
但是,此代码仅适用于 required_if
,但 digits_between
仍然无效。我阅读了 laravel 验证文档,但我不是用户如何正确检查它。
#Edit
但是,digits_between
验证仍然检查即使 use_spo
或 po_type
不是 1。我还想要 digits_between
和 use_spo
时的 po_type
验证等于 1。
答案 0 :(得分:3)
根据解释,我相信您可以有条件地添加规则。没有理由让它变得更复杂。
public function rules()
{
$rules = [
'use_spo' => 'required',
'po_type' => 'required',
];
if (request("use_spo") == 1 && request("po_type") == 1) {
$rules['start_po_no'] = 'required|digits_between:1,9';
}
return $rules;
}
答案 1 :(得分:0)
我有两种方法
return [
'use_spo' => 'required',
'po_type' => 'required',
'start_po_no' => [
Rule::requiredIf(function () use ($supplierPoUse, $generatePo) {
return request("use_spo") == 1 && request("po_type") == 1;
}),
function ($attribute, $value, $fail) {
if (request("use_spo") == 1 && request("po_type") == 1) {
if(!(1 <= $value && $value <= 9))
$fail('The '.$attribute.' is invalid.');
}
}
]
];
不要在之后使用数字,而是在验证规则运行后使用。 您可以在初始验证后添加验证。
$validator = Validator::make(...);
$validator->after(function ($validator) {
if (request("use_spo") == 1 && request("po_type") == 1) {
if(!(1 <= $value && $value <= 9))
$validator->errors()->add(
'start_po_no', 'invalid start po no'
);
}
});
if ($validator->fails()) {
// throw your validation exception
}