【问题标题】:Laravel 5.2+ date before and after date validation not workingLaravel 5.2+ 日期之前和之后的日期验证不起作用
【发布时间】:2016-04-09 08:11:39
【问题描述】:

这行得通

'expected_at' => 'date|after:"2016-04-09 10:48:11"',

这行得通

$rules['expected_at'] = 'date|after:'.$opportunity->created_at;

这不起作用

'expected_at' => 'date|after:created_at',

数据库中的“created_at”值正好如下

2016-04-09 10:48:11

请注意,表单以以下格式将 expected_at 日期传递给验证器

2016-04-09

我假设这意味着您不能直接引用验证器中的模型字段?

【问题讨论】:

标签: php date laravel laravel-5 strtotime


【解决方案1】:

在 5.3(我测试过的版本)的 laravel 文档中:

您可以指定另一个字段与日期进行比较,而不是传递要由 strtotime 评估的日期字符串:

'finish_date' => '必需|日期|之后:开始日期'

https://laravel.com/docs/5.3/validation#rule-after

遵循“after”规则的字符串(在本例中为 start_date)不是数据库字段,而是传递给验证器的输入字符串的一部分。

因此,按照您在上面尝试执行的操作,验证器期望一个名为“created_at”的字段与您提交的其余输入一起传递,这可能不存在,因为您的意图是让它读取来自您的模型,这将导致它失败。

长话短说,您最后的陈述是正确的。 “之前/之后”规则不引用模型字段,而是传递给验证器的其他输入字段,或者可以由“strtotime”解释的日期字符串

【讨论】:

    【解决方案2】:

    这可以验证为:

    'expected_at'  => 'required|before:' . date('Y-m-d') . '|date_format:Y-m-d',
    

    您甚至可以向验证器传递一个日期参数并在验证时进行比较。我假设,您正在搜索 date_format 验证器。

    【讨论】:

    • 不,这不是我要问的,日期格式翻译得很好。问题是 Laravel 无法使用验证器语法引用模型中的字段 - 您必须将其设置为 $opportunity->created_at;
    【解决方案3】:

    同意@Gordon,你可以试试这个,不用FormRequest中的格式:

    'expected_at' => "date|after:{$this->user()->created_at}",
    

    注意:无法参考DB值的原因是因为在这个阶段没有定义模型可以使用。

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 2015-01-05
      • 1970-01-01
      • 2020-10-02
      • 2015-10-28
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多