【问题标题】:Validate a date in Laravel to be 6 days after another date field验证 Laravel 中的日期在另一个日期字段之后 6 天
【发布时间】:2019-04-02 03:55:12
【问题描述】:

我正在处理 Laravel 表单字段并添加了 2 个日期输入字段(出发日期和返回日期)。我正在尝试在 Laravel 中创建一个自定义后端验证,其中出发日期必须在现在之后,而返回日期必须在出发日期后 6 天。请帮忙?

验证参数

'departure_date' => 'required|date|after:now',

//Must be 6 days after departure date
'return_date' => 'required|date|after:departure_date + 6 day',

我正在使用的验证逻辑

//Added at the top of the controller
use Illuminate\Foundation\Http\FormRequest;

//Controller code
  public
    function validatePlanEntries(Request $request)
    {   
        $validation = $this->validate($request, [
            'departure_date' => 'required|date|after:now',

            //Must be 6 days after departure date
            'return_date' => ['required', 'date', function ($attribute, $value, $fail) {
                        if (strtotime($value) < strtotime(request('departure_date')) + 518400) {
                            $fail('Departure date invalid');
                        }
                    }
            ]
        ]
    }

【问题讨论】:

    标签: laravel date


    【解决方案1】:

    使用这个

    $date = Carbon\Carbon::parse($date_from);
    $sixdays = $date->addDays(6);
    

    并设置此规则

    $rule['return_date'] = 'required|date|before:'.$sixdays
    $message['return_date.before'] = 'This field is must before 6 days of starts date';
    

    【讨论】:

    • @ShaiendraGupta,,, 有没有什么逻辑我可以在不使用碳的情况下使用,通过作曲家安装碳时出现错误
    • 使用这个date('Y-m-d', strtotime($yourDatehere. ' + 6 days'));
    • 根据您的建议,这是我添加的代码'return_date' =&gt; 'required|date|date('Y-m-d', strtotime(departure_date. ' + 6 days'))',,但它抛出 Parse error: syntax error, unexpected 'Y' (T_STRING), expecting '] '
    • 你做错了,你必须像这样 `$rule['return_date'] = 'required|date|before:'.date('Ym-d', strtotime(出发日期。'+ 6 天'));
    • 更新的答案请检查并接受,以便其他人可以得到它
    【解决方案2】:

    您可以使用Closure 解决方案。

    $validator = \Validator::make($request->all(), [
        'departure_date' => 'required|date|after:now',
    
        //Must be 6 days after departure date
        'return_date' => ['required', 'date', function ($attribute, $value, $fail) {
                    if (strtotime($value) < strtotime(request('departure_date')) + 518400 /* 6*24*60*60 */) {
                        $fail('Departure date invalid');
                    }
                }
            ],
        ]
    );
    

    编辑

    您不需要在顶部添加FormRequest,您的代码中缺少一个破解程序。

    function validatePlanEntries(Request $request)
    {
        $validator = \Validator::make($request, [
            'departure_date' => 'required|date|after:now',
    
            //Must be 6 days after departure date
            'return_date' => ['required', 'date', function ($attribute, $value, $fail) {
                if (strtotime($value) < strtotime(request('departure_date')) + 518400) {
                    $fail('Departure date invalid');
                }
            }]
        ]);
        if ($validator->fails()) {
            //return errors in $validation->error();
        }
        //else continue
    }
    

    【讨论】:

    • ,,我已经尝试了您的第二个建议,但收到此错误 类闭包对象无法转换为字符串
    • 写了start_at而不是departure_date。编辑了答案。而第二种解决方案仅适用于在rules() 方法中扩展Illuminate\Foundation\Http\FormRequest::class 的类。
    • 我仍然得到与我上面指出的相同的错误,根据你的建议,我在控制器顶部添加这行代码use Illuminate\Foundation\Http\FormRequest; 接下来我已经完全按照原样添加了第一个解决方案在您的代码中,但我收到此错误 Object of Class Closure could not be converted to string 并且正在使用 Larvel 5.4 版
    • @N696,, 试图理解你的代码,我应该在我的控制器中的 validate 方法中添加它还是另一个文件然后导入它,因为我使用的是 Laravel 5.4 版
    • @Patweb 在你的控制器的 validate 方法中使用第一个解决方案
    猜你喜欢
    • 2015-04-30
    • 2018-10-12
    • 2011-10-18
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多