在 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 步骤的验证结果。
近期评论