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

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

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);

问题是,当我在“product_price”字段中输入字符串时,我收到错误:

无效参数异常 比较的值必须具有相同的类型

为什么?我的意思是,在检查它是否>0之前,我正在检查它是否应该是数字


答案 1

gt,,并且添加到Laravel 5.6及更高版本中,我猜这一定是您遇到错误的原因。(不过它对我有用。gteltlte

我想你可以像这样尝试

$request->validate([
    'product_price' => 'required|numeric|min:0|not_in:0',
]);

min:0确保最小值为 0,并且不允许有负值。 确保值不能为 0。因此,这两个规则的组合可以完成工作。not_in:0

您可以为特定规则定义有意义的错误消息。(您也可以使用正则表达式获得相同的结果。


答案 2

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

这里的问题是,Laravel正在测试所有验证规则,并且在第一个验证错误之后没有停止,在你的例子中(由于提供的值是字符串而失败),如果它这样做了,那么提供验证器的错误就不会被抛出,因为验证程序已经在错误后退出了。numericgtnumeric

要让Laravel在第一个失败的验证规则后停止验证检查,您可以在验证规则前面加上验证器,这基本上告诉Laravel在第一个错误后停止。bail

生成的代码将如下所示:

$request->validate([
    'product_price' => 'bail|required|numeric|gt:0',
]);

请注意,此解决方案还使每个字段只返回一个错误,如果在 UI 中,您通常一次显示特定字段的所有错误(而不是仅从消息袋中选取第一个错误),则此解决方案将改变这一点。

有关验证规则的更多信息,请参阅:https://laravel.com/docs/6.x/validation#rule-bailbail


推荐