Php Laravel:验证大于零的数字失败

Php Laravel:验证大于零的数字失败,php,laravel,validation,laravel-validation,Php,Laravel,Validation,Laravel Validation,我必须验证一个需要大于零(0.01有效)的价格字段,因此我有以下验证: $request->validate([ 'product_price' => 'required|numeric|gt:0', ]); 问题是,当我在“product_price”字段中输入字符串时,我得到一个错误: InvalidArgumentException所比较的值必须为 同类型 为什么呢?我的意思是,我在检查它是否应该是数字之前,甚至在检查它是否>0你可以这

我必须验证一个需要大于零(0.01有效)的价格字段,因此我有以下验证:

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);
问题是,当我在“product_price”字段中输入字符串时,我得到一个错误:

InvalidArgumentException所比较的值必须为 同类型

为什么呢?我的意思是,我在检查它是否应该是数字之前,甚至在检查它是否>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,不允许出现负值<代码>不在: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版本。

我可以看出,其他答案都没有真正解决您出现此错误的真正原因,我将尝试提供一些见解和解决方案

这里的问题是,Laravel正在测试所有验证规则,并且在出现第一个验证错误后没有停止,在您的情况下,第一个验证错误是
numeric
(由于提供的值是字符串,因此失败),如果提供了
gt
验证程序,则不会抛出字符串值,因为验证程序已在
数值
错误后退出

要让Laravel在第一个验证规则失败后停止验证检查,您可以使用
bail
验证器作为验证规则的前缀,该验证器基本上告诉Laravel在第一个错误后停止

生成的代码如下所示:

$request->validate([
    'product_price' => 'bail|required|numeric|gt:0',
]);
请注意,此解决方案还使每个字段只返回一个错误,如果在UI中通常一次显示特定字段的所有错误(而不是仅从消息包中选择第一个),此解决方案将改变这一点


有关
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;
        }

gt规则是:
gt:field
,在您的原因中,您给出了0。我还没有尝试过这个方法,但我相信它不会对我起作用,因为问题清楚地表明0.1是一个有效值,您的答案将初始值限制为>=10。例如,1。同样,它必须大于零,但不需要将其起点缩小到初始值0.1、0.01、0.001。。。都是有效值此规则允许所有大于0小于10000的数字。包括0.1、0.001等十进制数字。这就是你想要的吗?对不起,我弄错了,没有正确阅读答案。一个问题,你的答案允许零吗?因为它不应该。很抱歉问一下,只是在我回家之前我无法测试它。它很有魅力!只是要测试一下。从我在网上看到的所有解决方案中,你的是最直接、最干净的。谢谢