我正在使用Laravel 5.3来验证事件的start_date和end_date。
end_date应该等于start_date或after date。 end_date >= start_date
$validator = Validator::make($data, [
'start_date' => 'required|date',
'end_date' => 'required|date|after:start_date',
]);
我尝试在之后使用,但它仅适用于end_date>开始日期。
当然,我可以使用Validator::extend
添加自定义规则,但我想知道我们是否可以不添加自定义规则。
有没有办法添加否定规则或添加> =规则?
由于
答案 0 :(得分:25)
$validator = Validator::make($data, [
'start_date' => 'required|date',
'end_date' => 'required|date|after_or_equal:start_date',
]);
使用 after_or_equal
答案 1 :(得分:4)
实际上,在使用至少Laravel版本after_or_equal
时,您还可以使用before_or_equal
和5.3.31
。这可能有助于避免升级到更高级的Laravel版本。
答案 2 :(得分:3)
升级到 5.4 ,您可以使用after_or_equal 看到 https://laravel.com/docs/5.4/validation#rule-after-or-equal
答案 3 :(得分:1)
在设置验证规则after_or_equal:now
和date_format
时,请注意不要设置小时,分钟或秒的格式!
例如:
$validationRules = [
'my_time_start' => [
'date_format:Y-m-d',// format without hours, minutes and seconds.
'after_or_equal:now'
]
];
Laravel将所有日期字段传递到strtotime()
函数中。
包括now
字符串。
并且strtotime('now')
将返回带有当前分钟,小时和秒的UNIX时间戳。
例如,今天是2020-05-03
。
当您将日期值2020-05-03
发送到脚本中时,Laravel会将2个值传递到strtotime()
中进行比较:
strtotime('2020-05-03'); // always 1588489200
strtotime('now'); // NOT PREVIOUS VALUE, a different value each second, timestamp including current minutes, hour and seconds.
您将始终无法通过验证(不包括一天中的1秒钟)。
要修复它,您应该使用:
$validationRules = [
'my_time_start' => [
'date_format:Y-m-d',// format without hours, minutes and seconds.
'after_or_equal:' . date('Y-m-d'), // not 'now' string
]
];