У меня на входе есть массив диапазонов дат:
[
[ '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
недопустимы, потому что они пересекаются друг с другом.
Может быть, это будет вам полезно? packagist.org/packages/v-matsuk/time-overlap-calculator
Я добавил ответ, попробуйте, дайте мне знать, работает ли он
Посмотрев на ваше требование, вы должны создать настраиваемое правило проверки, которое будет возвращать истину, если ни один диапазон дат не совпадает, и ложь в противном случае.
Чтобы реализовать такую вещь, вы должны создать настраиваемый диапазон правил проверки с помощью следующей команды 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],
. . .
];
}
Здесь данные - это параметр, в котором отправляются диапазоны дат.
Надеюсь, ты поймешь. Если требуются какие-либо дополнительные объяснения, не стесняйтесь спрашивать.
В системе проверки Laravel для этого нет правила предварительной сборки, вам нужно реализовать это вручную ...