Laravel Soft Delete Уникальное имя столбца

Предположим, у меня есть таблица категорий, и я использовал для нее мягкое удаление. Теперь впервые я добавил одну категорию «Тест», после чего я удалил эту категорию, чтобы она обновила мой столбец deleted_at из базы данных.

Теперь, когда я снова пытаюсь добавить категорию с именем «Тест», мне говорят, что это имя занято. Я пробовал с правилами, которые опубликованы Здесь.

Но это не работает. Я использовал черту в своей модели. Ниже приведен код моей модели.

<?php
namespace App\Models;

use Illuminate\Support\Facades\Validator as Validator;
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Category extends \Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

    /**
     * Guarded fields which are not mass fillable
     *
     * @var array
     */
    protected $guarded = array('id');

    /**
     * Name of the table used
     *
     * @var string
     */
    protected $table = 'travel_categories';

    /**
     * Validating input.
     *
     * @param array $input
     * @return mixed (boolean | array)
     */
    public static function validate($input, $id = null) {
        $rules = array(
            'name' => array('required','min:2','max:100','regex:/[a-zA-z ]/','unique:travel_categories,name,NULL,id,deleted_at,NULL'),
            'description' => 'Required|Min:2',
            'image' => 'image'
        );
        if ($id) {
            $rules['name'] = 'Required|Between:3,64|Unique:travel_categories,name,'.$id;
        }

        $validation = Validator::make($input,$rules);

        return ($validation->passes())?true : $validation->messages();
    }
}

person Alankar More    schedule 17.10.2014    source источник
comment
Насколько я понимаю, laravel использует столбец delete_at для мягкого удаления, но база данных (mysql) этого не знает, все это понимает столбец datetime, поэтому, когда вы делаете столбец уникальной базой данных, следуйте правилам, сохраняйте его уникальным... и я думаете, это поможет вам stackoverflow.com/questions/17458681/   -  person NULL    schedule 17.10.2014


Ответы (3)


Вы поняли цель мягкого удаления? Он только пометит данные как неактивные. Хотя это будет там.

Итак, если вы определяете, что значения этого столбца должны быть уникальными, правильно, вы не можете создать другой такой же.

  • Если он должен быть уникальным, вам следует restore и update данные.
  • Если их может быть много, вам следует удалить примененный к нему уникальный ключ (и, например, вызвать его по отношению).

Посмотрите: мягкое удаление Laravel Eloquent

person Seiji Manoan    schedule 17.10.2014

Во-первых: я не понимаю пару вещей. Вы пытаетесь подтвердить создание и обновление? Тогда почему вы позволяете имени иметь длину от 2 до 100 для создания и только от 3 до 64 для после обновлений?

Во-вторых: я рекомендую отказаться от этого:

protected $dates = ['deleted_at'];

Я не вижу в этом цели.

В-третьих, и я подхожу к сути, что вы пытаетесь сделать? Я думаю, что вы пытаетесь сделать с этим фильтром 'unique:travel_categories,name,NULL,id,deleted_at,NULL', чтобы проверить уникальность name среди активных категорий. В таком случае это должно сработать.

person hannesvdvreken    schedule 17.10.2014
comment
Я использовал правила проверки здесь. то, что я хочу, это когда я создаю или обновляю новую запись, тогда она будет применять правила проверки против значения, введенного пользователем. Правила указаны в методе validate. Теперь, когда я пытаюсь создать или обновить новую категорию, она должна проверить уникальность category name, которая имеет deleted_at = null в базе данных. - person Alankar More; 20.10.2014

Я знаю, что этот вопрос старый, но у меня была похожая проблема, и я наткнулся на это. Я хотел упомянуть, как я это исправил, для всех, кто будет читать это в будущем. Проблема у меня была в том, что Laravel не позволял вставить значение в уникальный столбец, когда была старая запись с таким же значением, но удалялась с помощью soft_delete.

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

  • категория - уникальный
  • delete_at — отслеживает удаленные строки

Оба должны быть указаны как уникальные в миграции, например:

 Schema::create('table_name', function (Blueprint $table) {
        $table->string("category");
        $table->softDeletes();
        $table->unique(["category", "deleted_at"]);
    });

Боковое примечание: если у вас уже есть таблица, как у меня, вам нужно изменить миграцию и снова создать таблицу (очевидно, данные будут потеряны):

  • Удалить таблицу
  • Изменить миграцию
  • Удалить запись об этом из таблицы миграций
  • запустите php artisan migrate, чтобы снова создать таблицу
person Kaloyan    schedule 20.03.2020
comment
Извините, но это не сработает. Неудаленные строки будут иметь нуль в столбце «deleted_at», а нулевые значения не вызывают ограничение «уникальность». Это уникальное ограничение гарантирует только то, что две категории не будут удалены одновременно. - person sergio0983; 03.06.2020
comment
Возможно, есть недоразумение. Я ожидаю, что строки с "deleted_at" = null не вызовут ограничения уникальности. Если "deleted_at" = null, то у нас есть активная строка, то есть она была вставлена, но не удалена. Таким образом, оно будет проигнорировано, и проверка уникальности будет использовать только значение в столбце категории, который является основным столбцом уникальности в моем примере выше. Что эта настройка сделала для меня, так это то, что она позволила уникальной проверке работать как обычно, но игнорировать обратимо удаленные строки. - person Kaloyan; 04.06.2020
comment
Просто чтобы подтвердить, что решение работает отлично. - person Daniel Loureiro; 01.04.2021
comment
Здорово! Спасибо. - person Kaloyan; 05.04.2021