Laravel 5.2+日期验证前后的日期不起作用


Laravel 5.2+ date before and after date validation not working

这适用于

'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

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

2016-04-09

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

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

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

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

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

"后面的字符串;在";rule(在本例中为start_date)不是数据库字段,而是传递给验证器的输入字符串的一部分。

因此,按照您上面试图做的操作,验证器期望一个名为"的字段;created_ at";与您提交的其他输入一起传递,这些输入可能不存在,因为您的意图是从模型中读取它,这会导致它失败。

长话短说,你的最后一句话是正确的。";"之前/之后";规则不引用模型字段,而是引用传递给验证器的其他输入字段,或者可以由";strtotime";

这可以验证为:

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

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

同意@Gordon的意见,您可以尝试这样做,而不需要FormRequest:中的格式

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

注意:不能引用DB值的原因是在此阶段没有定义要使用的模型。