没有不值得去解决的问题,也没有不值得去学习的技术!

在 Laravel 9 ,当有 2 组时间字段时,每一组为 2 个,一为开始,一为结束,验证必须存在一组时间字段的实现

在一个列表页面,有 2 组时间字段时,每一组为 2 个,一为开始,一为结束,需要验证必须存在一组时间字段
1、在一个列表页面,有 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
最终验证规则实现如下,依赖于 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
当 shipping_at_gmt_start、shipping_at_gmt_end 皆不存在时,那么 operated_at_gmt_start 必填。符合预期
图3
5、反之,另一组字段,也符合第 3、4 步骤的验证结果。

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理