Создание собственного правила «Существует» в Laravel с разными идентификаторами существования

Laravel, одна из самых популярных платформ PHP, предоставляет мощную систему проверки, которая позволяет разработчикам определять собственные правила проверки. В этой статье блога мы рассмотрим, как создать собственное правило «существует» в Laravel, где проверка существования выполняется для столбца базы данных, отличного от первичного ключа по умолчанию. Мы рассмотрим несколько методов, используя разговорный язык и примеры кода, которые помогут вам эффективно реализовать это специальное правило.

Метод 1: расширение класса Validator
Первый метод предполагает расширение класса Validator Laravel для определения нашего специального правила. Таким образом, мы можем переопределить поведение правила «exists» по умолчанию и указать другой столбец для проверки существования.

use Illuminate\Validation\Validator;
Validator::extend('exists_with_different_id', function ($attribute, $value, $parameters, $validator) {
    $table = $parameters[0];
    $column = $parameters[1];
    $idColumn = $parameters[2];
    $idValue = $parameters[3];
    return \DB::table($table)
        ->where($column, $value)
        ->where($idColumn, '<>', $idValue)
        ->exists();
});

Метод 2: использование объектов правил
Laravel предоставляет удобный способ определения пользовательских правил проверки с использованием объектов правил. Этот метод позволяет нам инкапсулировать логику проверки внутри класса для лучшей возможности повторного использования.

use Illuminate\Validation\Rule;
$rule = Rule::exists('table')->where(function ($query) use ($column, $idColumn, $idValue) {
    $query->where($column, $value)
        ->where($idColumn, '<>', $idValue);
});
$validator = Validator::make($data, [
    'column_name' => $rule,
]);

Метод 3. Создание пользовательского класса правил проверки
Для более сложных сценариев создание пользовательского класса правил проверки может обеспечить более чистый и организованный подход. Давайте создадим класс правил под названием ExistsWithDifferentIdRule:

namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ExistsWithDifferentIdRule implements Rule
{
    protected $table;
    protected $column;
    protected $idColumn;
    protected $idValue;
    public function __construct($table, $column, $idColumn, $idValue)
    {
        $this->table = $table;
        $this->column = $column;
        $this->idColumn = $idColumn;
        $this->idValue = $idValue;
    }
    public function passes($attribute, $value)
    {
        return \DB::table($this->table)
            ->where($this->column, $value)
            ->where($this->idColumn, '<>', $this->idValue)
            ->exists();
    }
    public function message()
    {
        return 'The selected :attribute does not exist with the provided ID.';
    }
}
$validator = Validator::make($data, [
    'column_name' => ['required', new ExistsWithDifferentIdRule('table_name', 'column_name', 'id_column_name', $id_value)],
]);

.

В этой статье мы рассмотрели различные методы создания специального правила «существует» в Laravel, позволяющего нам выполнять проверки существования столбца, отличного от первичного ключа по умолчанию. Мы рассмотрели расширение класса Validator, использование объектов Rule и создание собственного класса правил проверки. Эти методы обеспечивают гибкость и возможность повторного использования, позволяя вам эффективно обрабатывать сложные сценарии проверки в ваших приложениях Laravel.

Не забудьте выбрать метод, который лучше всего соответствует вашим требованиям и стилю кодирования. Приятного программирования с Laravel!