Задать вопрос

Не работает правило валидации Laravel: игнорирование проверки на уникальность (unique) при обновлении данных. Как исправить?

При создании раздела админки, для редактирования категорий товаров, возникла проблемы с валидацией при обновлении данных, а именно: игнорирования правил валидации уникального значения поля slag при обновлении данных.

В таблице базы данных categories, для ЧПУ ссылок, создано поле “slag” – с проверкой на уникальность
$table->string('slug')->unique();

В методе UPDATE ресурсного контролера прописан ряд правила для валидации, в том числе и для проверки на уникальность поля slag, с игнорированием текущего значения для обновления данных.
public function update(Request $request, $id)
    {
        $category = Category::find($id);
        $messages = [
            'name.required' => 'Поле "Наименование категории" обязательно для заполнения',
            'slug.required' => 'Поле "ЧПУ категории" обязательно для заполнения',
            'slug.unique' => 'Данные в поле "ЧПУ категории" должны быть уникальными',
           .....
        ];

        $this->validate($request, [
            'name' => 'required',
            'slug' => 'required|unique:categories,slug,'.$category->slug,
             ....
        ],$messages);


В соответствии с документацией, задано правило валидации:
'slug' => 'required|unique:categories,slug,'.$category->slug
//То есть
//slug' => 'required|unique:таблица,поле,текущее_значение'


Но почему-то это не работает, при внесении изменений и попытке сохранить данные, срабатывает ошибка валидации, почему-то игнорирования текущего значения при проверки поля на уникальность не происходит.

5fe48600bd7fc102526486.jpeg
Прошу помощи, где искать ошибку, куда смотреть?
  • Вопрос задан
  • 976 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@sidni
Php Developer
....
'slug' => 'required|unique:categories,slug,'.$id,
....
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Sanes
@Sanes
Оба примера из рабочего проекта
public function rules()
    {
        return [
            'name' => 'required|string|min:2|max:30',
            'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($this->id)],
            'password' => 'min:8',
            'role' => 'required'
        ];
    }
}

public function rules()
    {
        return [
            'title' => ['required', Rule::unique('vh_nodes', 'title')->ignore($this->id)],
            'url' => 'required',
            'login' => 'required',
            'password' => 'required',
        ];
    }
Ответ написан
Комментировать
@kandrash
Кратко о себе
Игнорировать по ID нужно, если в модели не прописано иное, а вы по slug пытаетесь.
// 'slug' => 'required|unique:categories,slug,'.$category->slug,
'slug' => 'required|unique:categories,slug,' . $category->id,
Ответ написан
Комментировать
FeL1ksS
@FeL1ksS
К правилу валидации не нужно делать конкатенацию самого значения.
Достаточно указать таблицу и поле.

'slug' => 'required|unique:categories,slug'

Так же можно опустить указание столбца таблицы, если наименование проверяемого поля совпадает со столбцом
'slug' => 'required|unique:categories'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы