Laravel проверяет массив диапазонов дат

У меня на входе есть массив диапазонов дат:

[
  [ 'start' => '2000-01-01 00:00:00', 'end' => '2000-01-01 06:00:00' ],
  [ 'start' => '2000-01-02 00:00:00', 'end' => '2000-01-02 12:00:00' ],
  [ 'start' => '2000-01-03 06:00:00', 'end' => '2000-01-03 12:00:00' ],
  [ 'start' => '2000-01-03 05:00:00', 'end' => '2000-01-03 10:00:00' ],
]

Все эти диапазоны должны быть уникальными и не пересекаться. Я пытаюсь найти способ проверить их с помощью Laravel Validator. В моем случае диапазоны с индексами 2 и 3 недопустимы, потому что они пересекаются друг с другом.

В системе проверки Laravel для этого нет правила предварительной сборки, вам нужно реализовать это вручную ...

Hamid Haghdoost 18.12.2018 16:14

Может быть, это будет вам полезно? packagist.org/packages/v-matsuk/time-overlap-calculator

brad 18.12.2018 16:36

Я добавил ответ, попробуйте, дайте мне знать, работает ли он

Sagar Gautam 19.12.2018 03:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
3
1 620
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Посмотрев на ваше требование, вы должны создать настраиваемое правило проверки, которое будет возвращать истину, если ни один диапазон дат не совпадает, и ложь в противном случае.

Чтобы реализовать такую ​​вещь, вы должны создать настраиваемый диапазон правил проверки с помощью следующей команды artisan.

php artisan make:rule Range

Теперь вы увидите Range.php в папке App\Rules\.

Затем сделайте свой код следующим образом.

Приложение \ Правила \ Range.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Range implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $intersect = true;
        for($i=0;$i<count($value); $i++){
            for($j=$i+1;$j<count($value); $j++){
                if ($value[$i]['start']<=$value[$j]['end'] && $value[$i]['end']>=$value[$j]['start'])
                {
                    $intersect = false;
                }
            }
        }
        return $intersect;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The dates intersect each other.';
    }
}

Теперь вы можете использовать правило диапазона в своей проверке следующим образом:

использование

Случай I

Если вы проверяете в контроллере,

      $this->validate($request,[
          . . .
         'data'=>[new Range],
          . . . 
       ]);

Дело II

Если вы создали класс Request, тогда

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
            return [
                . . . 
                'data' => [new Range],
                . . .
            ];
}

Здесь данные - это параметр, в котором отправляются диапазоны дат.

Надеюсь, ты поймешь. Если требуются какие-либо дополнительные объяснения, не стесняйтесь спрашивать.

Другие вопросы по теме