Laravel:验证大于零的数字失败
Laravel: Validating a number greater than zero is failing
我要验证一个价格字段,它需要大于零(0.01 有效)所以我有以下验证:
$request->validate([
'product_price' => 'required|numeric|gt:0',
]);
问题是当我在 'product_price' 字段中输入字符串时出现错误:
InvalidArgumentException The values under comparison must be of the
same type
这是为什么?我的意思是,在检查它是否 > 0
之前,我正在检查它是否应该是数字
你可以这样试试,
在调用 Validator::make() 函数之前,通过附加要比较的值来修改规则集,如下所示:
use Illuminate\Support\Facades\Validator;
Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
return intval($value) > intval($otherValue[0]);
});
$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);
gt
、gte
、lt
、lte
是在Laravel 5.6以后的版本中加入的,估计是这个原因你得到错误。 (虽然它对我有用。)
我想你可以这样试试
$request->validate([
'product_price' => 'required|numeric|min:0|not_in:0',
]);
min:0
确保最小值为 0,不允许有负值。 not_in:0
确保值不能为 0。因此,这两个规则的组合可以完成这项工作。
您可以为特定规则定义有意义的错误消息。 (您也可以使用正则表达式获得相同的结果。)
对我来说,这段代码在我的项目中有效。
$validation_rules = array(
'user_id' => 'required|integer|gt:0',
'type_id' => 'required|integer|gt:0',
);
$validation = Validator::make($request->all(), $validation_rules);
这里,gt:0检查整数是否大于零。
希望这对您有用。如果不是,请检查您的 Laravel 版本。
我可以看到 none 的其他答案已经解决了您收到此错误的真正原因,我将尝试提供一些见解和解决方案。
这里的问题是 Laravel 正在测试所有验证规则并且在第一个验证错误之后没有停止,在您的情况下是 numeric
(由于提供的值是一个字符串而失败),如果它确实提供了 gt
验证器的错误,则不会抛出字符串值,因为验证器在 numeric
错误后已经退出。
要让 Laravel 在第一个验证规则失败后停止验证检查,您可以在验证规则前加上 bail
验证器,它基本上告诉 Laravel 在第一个失败后停止错误。
生成的代码如下所示:
$request->validate([
'product_price' => 'bail|required|numeric|gt:0',
]);
请注意,如果在您的 UI 中您通常一次显示特定字段的所有错误(而不是仅选择消息包中的第一个),此解决方案将改变这一点。
可在此处找到有关 bail
验证规则的更多信息:https://laravel.com/docs/6.x/validation#rule-bail
对我来说,这段代码在我的项目中有效,
use Validator;
$rules = [
'product_price' => 'required|gt:0',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(array('status' => false, 'msg' => $validator->errors()->first()));
exit;
}
我要验证一个价格字段,它需要大于零(0.01 有效)所以我有以下验证:
$request->validate([
'product_price' => 'required|numeric|gt:0',
]);
问题是当我在 'product_price' 字段中输入字符串时出现错误:
InvalidArgumentException The values under comparison must be of the same type
这是为什么?我的意思是,在检查它是否 > 0
之前,我正在检查它是否应该是数字你可以这样试试,
在调用 Validator::make() 函数之前,通过附加要比较的值来修改规则集,如下所示:
use Illuminate\Support\Facades\Validator;
Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
return intval($value) > intval($otherValue[0]);
});
$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);
gt
、gte
、lt
、lte
是在Laravel 5.6以后的版本中加入的,估计是这个原因你得到错误。 (虽然它对我有用。)
我想你可以这样试试
$request->validate([
'product_price' => 'required|numeric|min:0|not_in:0',
]);
min:0
确保最小值为 0,不允许有负值。 not_in:0
确保值不能为 0。因此,这两个规则的组合可以完成这项工作。
您可以为特定规则定义有意义的错误消息。 (您也可以使用正则表达式获得相同的结果。)
对我来说,这段代码在我的项目中有效。
$validation_rules = array(
'user_id' => 'required|integer|gt:0',
'type_id' => 'required|integer|gt:0',
);
$validation = Validator::make($request->all(), $validation_rules);
这里,gt:0检查整数是否大于零。
希望这对您有用。如果不是,请检查您的 Laravel 版本。
我可以看到 none 的其他答案已经解决了您收到此错误的真正原因,我将尝试提供一些见解和解决方案。
这里的问题是 Laravel 正在测试所有验证规则并且在第一个验证错误之后没有停止,在您的情况下是 numeric
(由于提供的值是一个字符串而失败),如果它确实提供了 gt
验证器的错误,则不会抛出字符串值,因为验证器在 numeric
错误后已经退出。
要让 Laravel 在第一个验证规则失败后停止验证检查,您可以在验证规则前加上 bail
验证器,它基本上告诉 Laravel 在第一个失败后停止错误。
生成的代码如下所示:
$request->validate([
'product_price' => 'bail|required|numeric|gt:0',
]);
请注意,如果在您的 UI 中您通常一次显示特定字段的所有错误(而不是仅选择消息包中的第一个),此解决方案将改变这一点。
可在此处找到有关 bail
验证规则的更多信息:https://laravel.com/docs/6.x/validation#rule-bail
对我来说,这段代码在我的项目中有效,
use Validator;
$rules = [
'product_price' => 'required|gt:0',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(array('status' => false, 'msg' => $validator->errors()->first()));
exit;
}