Laravel:验证需要大于另一个的整数字段

问题描述 投票:0回答:9

我有两个字段,仅当两个字段都不存在时才是可选的:

$rules = [
  'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
  'end_page' => 'required_with:initial_page|integer|min:2|digits_between:1,5'
]; 

现在,

end_page
需要大于
initial_page
。如何包含此过滤器?

php laravel laravel-5
9个回答
72
投票

这个问题是在2015年提出的,所以大多数答案现在也已经过时了。

我想给出使用 Laravel 团队提供的功能(包含在新版本中)的答案,

正如 @Sarpadoruk 所说,从 laravel 5.6 开始,laravel 在验证中添加了如下功能:

gt
gte
lt
lte
表示:

  • gt
    - 大于
  • gte
    - 大于等于
  • lt
    - 小于
  • lte
    - 小于等于

因此,使用

gt
,您可以检查您的
end_page
是否应该大于您的
initial_page
,您的任务现在变得非常简单:

$rules = [
  'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
  'end_page' => 'required_with:initial_page|integer|gt:initial_page|digits_between:1,5'
]; 

60
投票

没有内置验证器可以让您像Laravel中那样比较字段值,因此您需要实现一个自定义验证器,这可以让您在需要时重用验证。幸运的是,Laravel 使得编写自定义验证器真的很容易

首先在您的

AppServiceProvider中定义新的验证器:

class AppServiceProvider extends ServiceProvider { public function boot() { Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) { $min_field = $parameters[0]; $data = $validator->getData(); $min_value = $data[$min_field]; return $value > $min_value; }); Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) { return str_replace(':field', $parameters[0], $message); }); } }

现在您可以在

$rules中使用全新的验证规则:

$rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5' ];

您可以在此处找到有关创建自定义验证器的更多信息:

http://laravel.com/docs/5.1/validation#custom-validation-rules。它们很容易定义,然后可以在验证数据的任何地方使用。


22
投票
对于 Laravel 5.4 它将是:

$rules = ['end_page'=>'min:'.(int)$request->initial_page]
    

18
投票
从 Laravel 5.6 开始,添加了

gt

gte
lt
lte
 规则。


15
投票
我想你可以尝试这样的事情,

$init_page = Input::get('initial_page'); $rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|integer|min:'. ($init_page+1) .'|digits_between:1,5' ];
    

5
投票
使用 gt = 大于:值|字段

使用 gte = 大于等于:值|字段

使用 lt = 小于:值|字段

使用lte =小于等于:值|字段

您的情况是:

gt:initial_page
结果将是:

$rules = array( 'initial_page' => 'required_with:end_page|numeric|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|numeric|gt:initial_page|min:2|digits_between:1,5' );
    

3
投票
为什么不直接定义

$min_number = $min + 1

 数字并使用验证器 
min:$min_number
,例如:

$min = intval($data['min_number']) + 1; return ['max_number' => 'required|numeric|min:'.$min];

然后您可以返回自定义错误消息以向用户解释错误。


1
投票
如果您在 Laravel 5.2 上维护项目,那么以下内容应该为您反向移植当前的 gt 规则:

class AppServiceProvider extends ServiceProvider { public function boot() { Validator::extend('gt', function($attribute, $value, $parameters, $validator) { $min_field = $parameters[0]; $data = $validator->getData(); $min_value = $data[$min_field]; return $value > $min_value; }); Validator::replacer('gt', function($message, $attribute, $rule, $parameters) { return sprintf('%s must be greater than %s', $attribute, $parameters[0]); }); } }

然后您可以按照当前文档使用它:

$rules = [ 'end_page' => 'gt:initial_page' ];
    

1
投票
在 Laravel 9.x 中你可以使用

gt:field


例如:

$rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|gt:initial_page' ];

https://laravel.com/docs/9.x/validation#rule-gt

© www.soinside.com 2019 - 2024. All rights reserved.