Как создать миграцию для добавления значения в перечисление в красноречивой
У меня есть таблица, содержащая поле перечисления
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')");
}
}