Проверка даты на основе массива Laravel after_or_equal несколько дат?

Я импортирую файл Excel в коллекции с помощью пакета laravel-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."
    ]

При проверке, как правило, при первой ошибке вы будете перенаправлены обратно. Чтобы избежать этого, вы можете разделить механизм проверки на 2 или более этапов. Не уверен, что вы это понимаете, но вы можете сделать что-то вроде: validate- ›this. затем подтвердите- ›это …. затем сохраните / обновите материал.   —  person SASM    schedule 25.01.2021

См. также:  Как заменить нативный comment_count совокупным счетчиком комментариев Evolved
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. SASM

    Чтобы указать настраиваемое сообщение об ошибке только для определенного атрибута, вы сначала указываете имя атрибута, а затем правило:

    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"
    }
    

    Хотелось бы посмотреть, есть ли другие подходы получше.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: