Laravel 验证器仅在两个值都存在时才将一个值与另一个值进行比较

Laravel validator compare one value to another only if both are present

我正在使用 Laravel 版本 v8.29.0

我正在使用 Laravel 验证器来验证从 HTTP 请求传入的值。在请求中,我有一个对象数组,每个对象都有一个 min 和一个 max 值。

现在我进行了验证,以确保 min 值小于 max 值以及 max 值大于 min 价值:

$this->validate($request, [    
    'someObject.*.someOtherObject.yetAnotherObject.min' => 'nullable|numeric|lte:someObject.*.someOtherObject.yetAnotherObject.max',
    'someObject.*.someOtherObject.yetAnotherObject.max' => 'nullable|numeric|gte:someObject.*.someOtherObject.yetAnotherObject.min',
]);

如果两个值都被传入,这工作得很好,但对于我的应用程序,允许只传入一个或另一个,或者两个都不传入。

如果我只传入 max 值,那么我会收到一条错误消息,指出 max 值需要大于 min 值,即使 [=12] =] 值未传入。

对于 min 值也是一样,如果我只传入 min 值,那么我会收到一条错误消息,指出 min 值必须小于 max值。

我的问题是,我需要对上面的代码进行哪些语法更改,以允许传入 minmax 的一个或另一个值,或者同时传入两个值,并且仅验证minmax 如果它们都被传入,那么它们是相互关联的吗?

我认为没有内置方法可以根据其他值是否存在有条件地使用 ltegte

您可以使用数组语法和 Closure 代替:

$this->validate($request, [
    'someObject.*.someOtherObject.yetAnotherObject.min' => [
        'nullable',
        'numeric',
        function ($attribute, $value, $fail) use ($request) {
            $max = $request->input(str_replace('min', 'max', $attribute));
            if (isset($value, $max) && $value > $max) {
                $fail(__('validation.lte.numeric', ['value' => $max]));
            }
        },
    ],
    'someObject.*.someOtherObject.yetAnotherObject.max' => [
        'nullable',
        'numeric',
        function ($attribute, $value, $fail) use ($request) {
            $min = $request->input(str_replace('max', 'min', $attribute));
            if (isset($value, $min) && $value < $min) {
                $fail(__('validation.gte.numeric', ['value' => $min]));
            }
        },
    ],
]);

在上面,我还使用了 __()(翻译)辅助函数来获取 Laravel 会返回的默认错误消息。