с миграцией, чтобы заполнить слаг со значением по умолчанию - PullRequest
0 голосов
/ 04 сентября 2018

В моем приложении Laravel 5.6 / PostgreSQL 10.5 У меня есть 2 таблицы:

CREATE TABLE public.rt_genres (
    id serial NOT NULL,
    published bool NULL DEFAULT false,
    created_at timestamp NOT NULL DEFAULT now(),
    updated_at timestamp NULL,
    CONSTRAINT rt_genres_pkey PRIMARY KEY (id)
)...

CREATE TABLE public.rt_genre_translations (
    id serial NOT NULL,
    genre_id int4 NOT NULL,
    "name" varchar(100) NOT NULL,
    description text NOT NULL,
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    locale varchar(2) NOT NULL,
    CONSTRAINT genre_translations_genre_id_locale_unique UNIQUE (genre_id, locale),
    CONSTRAINT rt_genre_translations_pkey PRIMARY KEY (id),
    CONSTRAINT genre_translations_genre_id_foreign FOREIGN KEY (genre_id) REFERENCES rt_genres(id) ON DELETE CASCADE
)

Мне нужно добавить поле slug в первую таблицу rt_genres. с правилом миграции:

    $table->string('slug', 105)->unique();

и получил ошибку:

: Unique violation: 7 ERROR:  could not create unique index "genres_slug_unique"                                          
DETAIL:  Key (slug)=(id) is duplicated.")

1) Если есть способ назначить в миграции какое-то уникальное значение по умолчанию, например = id -> по умолчанию ( 'rt_genres.id')

2) Было бы здорово присвоить значению слагов из public.rt_genre_translations.name, как я использую Плагин "cviebrock / eloquent-sluggable": "^ 4.5" в моем приложении? Могу ли я это сделать?

Спасибо!

1 Ответ

0 голосов
/ 05 сентября 2018

Значение по умолчанию можно получить только из другого столбца с триггером ( SO answer ).

Вы можете сделать столбец nullable:

$table->string('slug', 105)->nullable()->unique();

Или вы создаете столбец, вставляете уникальные значения и затем создаете индекс:

Schema::table('rt_genres', function($table) {
    $table->string('slug', 105);
});
DB::table('rt_genres')->update(['slug' => DB::raw('"id"')]);
Schema::table('rt_genres', function($table) {
    $table->unique('slug');
});
...