Как создать миграцию для добавления значения в перечисление в красноречивой

У меня есть таблица, содержащая поле перечисления

CREATE TABLE `user_status` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `values` enum('on', 'off'),
  PRIMARY KEY (`id`),
) ENGINE=InnoDB;

как создать миграцию для добавления значения в поле перечисления?

Ответы

Ответ 1

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

В этом случае я считаю, что лучший выбор - записать исходный SQL в миграцию:

public function up()
{
    DB::statement("ALTER TABLE user_status MODIFY COLUMN values ENUM('on','off','unknown')");
}

public function down()
{
    DB::statement("ALTER TABLE user_status MODIFY COLUMN values ENUM('on','off')");
}

Я мог бы ошибиться в синтаксисе SQL, я никогда не использовал ENUM, но вы все равно можете видеть идею.

Ответ 2

Я сделал это с MySql:

class ChangeJobTypeEnum extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::statement("ALTER TABLE _TABLENAME_ CHANGE _COLUMNNAME_ _COLUMNNAME_ ENUM('on', 'off', 'auto')");

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement("ALTER TABLE _TABLENAME_ CHANGE _COLUMNNAME_ _COLUMNNAME_ ENUM('on', 'off')");

    }
}

Ответ 3

У меня была немного другая ситуация, нужно было добавлять новые элементы, менять существующие и удалять старые. Это мой пример.

 <?php

    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;

class ChangeEnum extends Migration
{   
    public function up()
    {
        Schema::table('table_example', function (Blueprint $table) {
            DB::statement("ALTER TABLE table_example MODIFY status enum('first', 'second', 'third', 'fourth', 'fifth', 'sixth') NOT NULL;");
            DB::statement("UPDATE 'field' set 'status' = 'fourth' where 'status' = 'first';");
            DB::statement("UPDATE 'field' set 'status' = 'fifth' where 'status' = 'second';");
            DB::statement("ALTER TABLE table_example MODIFY status enum('third', 'fourth', 'fifth', 'sixth') NOT NULL;");
        });
    }

    public function down()
    {
        Schema::table('table_example', function (Blueprint $table) {
            DB::statement("ALTER TABLE table_example MODIFY status enum('first', 'second', 'third', 'fourth', 'fifth', 'sixth') NOT NULL;");
            DB::statement("UPDATE 'field' set 'status' = 'first' where 'status' = 'fourth';");
            DB::statement("UPDATE 'field' set 'status' = 'second' where 'status' = 'fifth';");
            DB::statement("ALTER TABLE table_example MODIFY status enum('first', 'second', 'third',) NOT NULL;");
        });
    }
}

Кстати, генерировать строковый SQL-запрос через JetBrains ide (DataGrip), вот так:

 ∧_∧ 
(。・ω・。)つ━☆・*。
⊂   ノ    ・゜+.
 しーJ   °。+ *´¨)

Ответ 4

Второй ответ работает, но в моем случае CHANGE выдавал ошибку. Поэтому я попытался использовать MODIFY вместо этого, и это сработало. Спасибо, парни..

Вот мой код:

class ChangeJobTypeEnum extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    DB::statement("ALTER TABLE _TABLENAME_ MODIFY _COLUMNNAME_ ENUM('on', 'off', 'auto')");

}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    DB::statement("ALTER TABLE _TABLENAME_ MODIFY_COLUMNNAME_ ENUM('on', 'off')");

}
}