sposchedule
50 строк · 1.8 Кб
1<?php
2
3namespace App\Rules;
4
5use Illuminate\Contracts\Validation\Rule;
6use App\Models\Semester; // Убедитесь, что путь к модели Semester верный
7use Carbon\Carbon;
8
9class NoOverlappingSemesters implements Rule
10{
11private $years;
12private $start;
13private $end;
14private $currentSemesterId;
15
16public function __construct($years, $start, $end, $currentSemesterId = null)
17{
18$this->years = $years;
19$this->start = Carbon::parse($start);
20$this->end = Carbon::parse($end);
21$this->currentSemesterId = $currentSemesterId;
22}
23
24public function passes($attribute, $value)
25{
26// Поиск пересекающихся семестров
27$overlappingSemester = Semester::where('years', $this->years)
28->where(function ($query) {
29$query->whereBetween('start', [$this->start, $this->end])
30->orWhereBetween('end', [$this->start, $this->end])
31->orWhere(function ($query) {
32$query->where('start', '<=', $this->start)
33->where('end', '>=', $this->end);
34});
35})
36->when($this->currentSemesterId, function ($query) {
37// Исключаем текущий семестр, если редактируем существующий
38$query->where('id', '!=', $this->currentSemesterId);
39})
40->exists();
41
42// Возвращаем true, если пересечений нет
43return !$overlappingSemester;
44}
45
46public function message()
47{
48return 'Указанный временной диапазон совпадает с существующим семестром.';
49}
50}
51