Laravel Правило :: уникальный не работает должным образом - PullRequest
0 голосов
/ 01 апреля 2020

Это моя миграция:

Schema::create('coupons', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name')->unique();
});

И это мой пользовательский запрос:

use Illuminate\Validation\Rule;

public function rules()
{
    return [
        'name' => [
            'required', 'string',
            Rule::unique('coupons')
            ->where(function ($q) {
                $q->where('name', 'OFFER-2020');
            })
    ]
}

Я пытаюсь заблокировать запросы, где поле купона name уже существует в таблице базы данных. , Поскольку OFFER-2020 строка уже существует в таблице coupons, она должна блокировать запрос, вместо этого она проходит проверку.

Обновление
Мой ввод был OFFER 2020. И OFFER-2020 - это значение после преобразования. Я думал, что laravel проверяет уникальность с OFFER-2020. Вместо этого он проверял как OFFER 2020, так и OFFER-2020 по запросу and. И именно поэтому мой уникальный не работал.

1 Ответ

0 голосов
/ 01 апреля 2020

Если вы введете OFFER-2020. Вам нужно будет только указать правильное имя столбца, которое является вторым параметром уникальных правил. Это проверит таблицу купонов для строки с тем же именем, что и у ввода.

Rule::unique('coupons', 'name')

Чтобы сделать ваш ввод сжатым, вы можете использовать метод запроса формы prepareForValidation (), это может преобразовать ваши данные.

function prepareForValidation() {
    $this->merge(['name' => Str::slug($this->get('name'))]);
}

Почему произошла ошибка предыдущей версии? Как вы можете видеть здесь, в Уникальный класс . Если вы не предоставите столбец, он будет по умолчанию идентификатором. Таким образом, ваш предыдущий запрос будет выглядеть примерно так:

select * from coupons where id = 'OFFER-2020' and name = 'OFFER-2020'
...