在 Laravel 9 ,当有 2 组时间字段时,每一组为 2 个,一为开始,一为结束,验证必须存在一组时间字段的实现
1、在一个列表页面,有 2 组时间字段时,每一组为 2 个,一为开始,一为结束,需要验证必须存在一组时间字段。如图1
2、总计 4 个字段,分别是:shipping_at_gmt_start、shipping_at_gmt_end、operated_at_gmt_start、operated_at_gmt_end。必须存在一组时间字段,既必须存在 shipping_at_gmt_start、shipping_at_gmt_end 。或者必须存在 operated_at_gmt_start、operated_at_gmt_end
3、最终验证规则实现如下,依赖于 required_without 实现。当 shipping_at_gmt_start、shipping_at_gmt_end 其中一个不存在时,那么 operated_at_gmt_start 必填。符合预期。如图2
public function validateIndex(array $params): ValidationValidator { $validator = Validator::make( $params, [ 'filter.shipping_at_gmt_start' => 'required_without:filter.operated_at_gmt_start,filter.operated_at_gmt_end|date', 'filter.shipping_at_gmt_end' => [ 'date', 'after_or_equal:filter.shipping_at_gmt_start', function ($attribute, $value, $fail) use ($params) { $startDate = Carbon::parse($params['filter']['shipping_at_gmt_start'])->addMonths(3); $endDate = Carbon::parse($value); if ($endDate->isAfter($startDate)) { $fail('交运时间结束与交运时间开始的跨度不可超过3个月'); } }, ], 'filter.operated_at_gmt_start' => 'required_without:filter.shipping_at_gmt_start,filter.shipping_at_gmt_end|date', 'filter.operated_at_gmt_end' => [ 'date', 'after_or_equal:filter.operated_at_gmt_start', function ($attribute, $value, $fail) use ($params) { $startDate = Carbon::parse($params['filter']['operated_at_gmt_start'])->addMonths(3); $endDate = Carbon::parse($value); if ($endDate->isAfter($startDate)) { $fail('操作时间结束与操作时间开始的跨度不可超过3个月'); } }, ], ], [ 'filter.shipping_at_gmt_start.required_without' => '时间筛选必填', 'filter.shipping_at_gmt_start.date' => '交运时间开始必须是日期', 'filter.shipping_at_gmt_end.date' => '交运时间结束必须是日期', 'filter.shipping_at_gmt_end.after_or_equal' => '交运时间结束必须晚于或等于交运时间开始', 'filter.operated_at_gmt_start.required_without' => '时间筛选必填', 'filter.operated_at_gmt_start.date' => '操作时间开始必须是日期', 'filter.operated_at_gmt_end.date' => '操作时间结束必须是日期', 'filter.operated_at_gmt_end.after_or_equal' => '操作时间结束必须晚于或等于操作时间开始' ] ); if ($validator->stopOnFirstFailure()->fails()) { throw new BusinessException(BusinessException::MODULE_ORDER, $validator->getMessageBag()->first()); } return $validator; }
4、当 shipping_at_gmt_start、shipping_at_gmt_end 皆不存在时,那么 operated_at_gmt_start 必填。符合预期。如图3
5、反之,另一组字段,也符合第 3、4 步骤的验证结果。
近期评论