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

Mat*_*one 4 php date strtotime laravel laravel-5

这有效

'expected_at' => 'date|after:"2016-04-09 10:48:11"',
Run Code Online (Sandbox Code Playgroud)

这有效

$rules['expected_at'] = 'date|after:'.$opportunity->created_at;
Run Code Online (Sandbox Code Playgroud)

这不起作用

'expected_at' => 'date|after:created_at',
Run Code Online (Sandbox Code Playgroud)

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

2016-04-09 10:48:11
Run Code Online (Sandbox Code Playgroud)

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

2016-04-09
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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

'finish_date' => 'required|date|after:start_date'

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

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

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

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