Как лучше всего изменить тип столбца при миграции на Laravel?

У меня есть таблица пользователей в моей БД:

        $table->increments('id');
        $table->string('fullName');
        $table->string('email')->unique();
        $table->string('password', 50);
        $table->enum('role',['boss','employee','customer'])->default('customer');
        $table->rememberToken();
        $table->timestamps();

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


person moh    schedule 10.07.2016    source источник


Ответы (2)


Вы можете попробовать:

  1. Создайте новый текстовый столбец с именем «roleTemp».
  2. Запустите запрос, чтобы установить этот столбец для каждой записи - на основе столбца «роль».
  3. Удалите столбец "роль"
  4. Переименуйте "roleTemp" в "role"

Теперь просто измените схему своей базы данных как есть:

$table->increments('id');
$table->string('fullName');
$table->string('email')->unique();
$table->string('password', 50);
$table->string('role');
$table->rememberToken();
$table->timestamps();

Обычно вы дублируете значения роли в (временный) столбец и переименовываете его. По крайней мере, это безопасно и не займет много времени.

person JasonK    schedule 10.07.2016

Это так же просто, как создать новую миграцию с этой единственной строкой. Обратите внимание на функцию ->change(), которая делает запрос ALTER.

Schema::table('usertable', function (Blueprint $table) {
    $table->string('role')->default('author')->change();
});

Помните, что размер для string () по умолчанию равен 255, и если ваше значение перечисления больше этого, оно усечет значение перечисления до 255 символов.

Обновление: вам необходимо установить doctrine/dbal, чтобы это работало, см. Миграция на Laravel - изменение столбцов

Чтобы установить doctrine / dbal, просто выполните composer require doctrine/dbal

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

person karmendra    schedule 10.07.2016
comment
Я применил ваше предложение, но столкнулся с этой ошибкой: [Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it. - person moh; 11.07.2016
comment
Смотрите мои обновления, это правильный ларавальный способ сделать это. - person karmendra; 11.07.2016
comment
Я выполнил эту установку, но не сработало! в вашей ссылке ([laravel.com/docs/master/migrations#modifying-columns]) вы можете прочитать это: Modifying any column in a table that also has a column of type enum is not currently supported. - person moh; 11.07.2016