我有两个字段,只有在两个字段都不存在时才是可选的:
$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。如何包含此过滤器?
end_page
initial_page
liwlm1x91#
这个问题是在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' ];
wr98u20j2#
没有内置的验证可以让你像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。它们易于定义,然后可以在验证数据的任何地方使用。
1mrurvl13#
对于Laravel 5.4,将为:
$rules = ['end_page'=>'min:'.(int)$request->initial_page]
8zzbczxx4#
自Laravel 5.6起,添加了gt、gte、lt和lte规则。
vxqlmq5t5#
我觉得你可以试试这样的,
$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' ];
mv1qrgav6#
使用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' );
b0zn9rqh7#
为什么不直接定义$min_number = $min + 1编号并使用验证器min:$min_number,例如:
$min_number = $min + 1
min:$min_number
$min = intval($data['min_number']) + 1; return ['max_number' => 'required|numeric|min:'.$min];
然后,您可以返回自定义错误消息,向用户解释错误。
0sgqnhkj8#
如果你在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' ];
i7uq4tfw9#
在Laravel 9.x中,您可以使用gt:field例如:
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
9条答案
按热度按时间liwlm1x91#
这个问题是在2015年提出的,所以现在大部分的答案也已经过时了。
我想给予答案是使用laravel团队提供的功能,这是包括在它的新版本,
因此,如@Sarpadoruk所述,自laravel 5.6起,laravel在确认中添加了
gt
、gte
、lt
和lte
等特性,这意味着:gt
-大于gte
-大于等于lt
-小于lte
-小于等于因此,使用
gt
,您可以检查end_page
是否应该大于initial_page
,现在您的任务变得非常简单:wr98u20j2#
没有内置的验证可以让你像Laravel中那样比较字段值,所以你需要实现一个自定义验证器,它可以让你在需要的地方重用验证。幸运的是,Laravel让编写自定义验证器变得非常容易。
首先在您的AppServiceProvider中定义新的验证器:
现在,您可以在**$rules**中使用全新的验证规则:
您可以在此处找到有关创建自定义验证器的更多信息:http://laravel.com/docs/5.1/validation#custom-validation-rules。它们易于定义,然后可以在验证数据的任何地方使用。
1mrurvl13#
对于Laravel 5.4,将为:
8zzbczxx4#
自Laravel 5.6起,添加了
gt
、gte
、lt
和lte
规则。vxqlmq5t5#
我觉得你可以试试这样的,
mv1qrgav6#
使用gt =大于:值|场
使用gte =大于等于:值|场
使用lt =小于:值|场
使用lte =小于等于:值|场
在你的情况下
结果就是
b0zn9rqh7#
为什么不直接定义
$min_number = $min + 1
编号并使用验证器min:$min_number
,例如:然后,您可以返回自定义错误消息,向用户解释错误。
0sgqnhkj8#
如果你在Laravel 5.2上维护一个项目,那么下面的代码应该可以为你反向移植当前的gt规则:
然后,您可以按照当前文档使用它:
i7uq4tfw9#
在Laravel 9.x中,您可以使用
gt:field
例如:
https://laravel.com/docs/9.x/validation#rule-gt