如何解决基于 Laravel 数组的日期验证 after_or_equal 多个日期?
我正在使用 laravel-excel 包将 excel 文件导入到集合中。我正在尝试验证日期字段 reporting_date
,使其为 after_or_equal
两个其他日期字段 registered_date
和 analysis_date
。只有一个 after_or_equal
日期字段,所有这些都可以正常工作。我正在动态填充规则和自定义消息数组。规则应用正确,但我无法通过此特定验证的自定义消息覆盖默认消息,而是显示默认消息。
public function collection(Collection $rows)
{
$data = $rows->toArray();
$rules = [Some static rules defined];
$messages = [];
foreach ($data as $key => $val){
/*Adding [complex/]conditional rules and messages.*/
...
...
if(!empty($val['reporting_date'])){
$rules = array_merge($rules,[$key.'.reporting_date' => ['sometimes','nullable','date','after_or_equal:'.$key.'.registered_date,','after_or_equal:'.$key.'.analysis_date']]);
$messages["$key.reporting_date.date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val,"reporting_date")?$val['reporting_date']:"").
"</strong> is not a valid date.";
/****These messages are not overriding the default message.****/
$messages["$key.reporting_date.after_or_equal.$key.registered_date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val,"reporting_date")?$val['reporting_date']:"").
"</strong> must be a date after or equal to registered_date <strong>".(Arr::exists($val,"registered_date")?$val['registered_date']:"").
"</strong>.";
$messages["$key.reporting_date.after_or_equal.$key.analysis_date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val,"reporting_date")?$val['reporting_date']:"").
"</strong> must be a date after or equal to analysis_date <strong>".(Arr::exists($val,"analysis_date")?$val['analysis_date']:"").
"</strong>.";
...
...
}
}
}
我收到的消息是
The 0.reporting_date must be a date after or equal to 0.registered_date.
The 0.reporting_date must be a date after or equal to 0.analysis_date.
验证规则:
"0.reporting_date" => array:5 [▼
0 => "sometimes"
1 => "nullable"
2 => "date"
3 => "after_or_equal:0.registered_date,"
4 => "after_or_equal:0.analysis_date"
]
我怀疑我没有将消息分配给正确的数组键,因此我没有看到自定义消息。现在它是这样分配的,我希望显示此消息。
"0.reporting_date.after_or_equal.0.registered_date" => "Error on row: 2. The reporting_date 2020-09-08 must be a date after or equal to registered_date 2020-09-12."
"0.reporting_date.after_or_equal.0.analysis_date" => "Error on row: 2. The reporting_date 2020-09-08 must be a date after or equal to analysis_date 2020-09-14."
也在调试错误信息。
dd($validator->errors());
0.reporting_date" => array:2 [▼
0 => "The 0.reporting_date must be a date after or equal to 0.registered_date."
1 => "The 0.reporting_date must be a date after or equal to 0.analysis_date."
]
解决方法
要仅为特定属性指定自定义错误消息,请先指定属性名称,然后是规则:
field.rule => message
喜欢
$messages = [
'email.required' => 'We need to know your email address!',];
所以我必须检查 0.reporting_date
是否为 after_or_equal
0.registered_date
和 0.analysis_date
。我的规则设置如下:
"0.reporting_date" => array:5 [▼
0 => "sometimes"
1 => "nullable"
2 => "date"
3 => "after_or_equal:0.registered_date,"
4 => "after_or_equal:0.analysis_date"
]
当 after_or_equal
的其中一项验证失败时,我可以覆盖像
0.reporting_date.after_or_equal => "custom message"
但是当 after_or_equal:0.registered_date
和 after_or_equal:0.analysis_date
都失败时,我认为可以为个别情况编写自定义消息,如下所示,这是理想的。
"0.reporting_date.after_or_equal.0.registered_date" => "custom message1"
"0.reporting_date.after_or_equal.0.analysis_date" => "custom message2"
但这不起作用,我不得不通过手动比较日期然后附加两条消息来解决问题。
if(!(Carbon::parse(0.reporting_date)->gte(Carbon::parse(0.registered_date)) && Carbon::parse(0.reporting_date)->gte(Carbon::parse(0.analysis_date)))){
0.reporting_date.after_or_equal => "custom message1"."custom message2"
}
我想看看是否有其他更好的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。