sposchedule

Форк
1
/
NoOverlappingSemesters.php 
50 строк · 1.8 Кб
1
<?php
2

3
namespace App\Rules;
4

5
use Illuminate\Contracts\Validation\Rule;
6
use App\Models\Semester; // Убедитесь, что путь к модели Semester верный
7
use Carbon\Carbon;
8

9
class NoOverlappingSemesters implements Rule
10
{
11
    private $years;
12
    private $start;
13
    private $end;
14
    private $currentSemesterId;
15

16
    public 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

24
    public 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, если пересечений нет
43
        return !$overlappingSemester;
44
    }
45

46
    public function message()
47
    {
48
        return 'Указанный временной диапазон совпадает с существующим семестром.';
49
    }
50
}
51

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

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.