Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 04.05.2025 15:24:33

Сложная валидация

Добрый день. Недавно перешёл с Yii2 на laravel. Пока не знаю как сделать проверку/валидацию.

Если таблица с пользователями, таблица с должностями. Справочные таблицы. Есть линковочная табл. с Историей должностей сотрудников. Там соответсвенно id_user, id_appointment, bdate (дата начала), edate (дата окончания). Многие ко многим.

Так вот при переводе, вставке новой записи, надо проверить что новая дата перевода (bdate) не меньше или равна максимальной дате окончания (edate) предыдущих переводов (а их может не быть вообще если чел. новый или несколько записей в бд). Если меньше или равна - выдать текст ошибки. Иначе сохранить и всё хорошо. Это кастомная валидация я так понимаю?

Не в сети

#2 Вчера 12:49:45

Re: Сложная валидация

Я бы создал новое правило валидации
https://laravel.com/docs/11.x/validatio … le-objects


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 Вчера 13:05:23

Re: Сложная валидация

Да, спасибо. Сам наколхозил уже. Вот. Просто у меня 3 разных модели с одной и той же проверкой.

<?php

namespace App\Rules;

use App\Models\{AppointmentHist, DivisionHist, KontrpostHist};
use Closure;
use Illuminate\Contracts\Validation\{DataAwareRule, ValidationRule};

class CheckDateRange implements DataAwareRule, ValidationRule
{
    private const LIST_CLASSES = ['myappointment' => AppointmentHist::class, 'mydivision' => DivisionHist::class, 'mykontrpost' => KontrpostHist::class];

    /**
     * Все данные находятся на проверке.
     *
     * @var array<string, mixed>
     */
    protected $data = [];

    /**
     * Установите данные для проверки.
     *
     * @param  array<string, mixed>  $data
     */
    public function setData(array $data): static
    {
        $this->data = $data;
        return $this;
    }

    /**
     * Run the validation rule.
     *
     * @param  \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $maxDate = self::LIST_CLASSES[array_key_first(array_intersect_key($this->data, self::LIST_CLASSES))]::where('id_user', (int) $this->data['id_user'])->where('id', '!=', (int) $this->data['id'])->max('edate');
        if (isset($maxDate) && (\DateTime::createFromFormat('Y-m-d', $value) <= \DateTime::createFromFormat('Y-m-d', $maxDate))) {
            $fail('validation.checkdaterange')->translate();
        }
    }
}

Не в сети

Подвал раздела