Laravel 基于数组的日期验证 after_or_equal 多个日期?

Laravel Array based date validation after_or_equal multiple dates?

我正在使用 laravel-excel 包将 excel 文件导入集合。我正在尝试验证日期字段 reporting_date,使其成为 after_or_equal 两个其他日期字段 registered_dateanalysis_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_date0.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_dateafter_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"
}

我想看看有没有其他更好的方法。