我有一个包含枚举字段的表
CREATE TABLE `user_status` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`values` enum('on', 'off'),
PRIMARY KEY (`id`),
) ENGINE=InnoDB;
如何创建迁移以向枚举字段添加值?
答案 0 :(得分:47)
Laravel不提供更新枚举列的方法。您可以删除并重新创建列,但在操作过程中可能会丢失数据,而且实际上并不是 clean 。
在这种情况下,我认为最好的选择是将原始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
,但无论如何你都可以看到这个想法。
答案 1 :(得分: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')");
}
}
答案 2 :(得分:1)
我的情况略有不同,有必要添加新项,更改现有项并删除旧项。这是我的例子。
<?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;");
});
}
}
顺便说一下,通过JetBrains ide(DataGrip)生成行SQL查询,就像这样:
∧_∧
(。・ω・。)つ━☆・*。
⊂ ノ ・゜+.
しーJ °。+ *´¨)
答案 3 :(得分:0)
第二个答案有效,但是在我的情况下,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')");
}
}
答案 4 :(得分:0)
我说
public function up()
{
Schema::create('dt_warehouses', function (Blueprint $table) {
**$table->enum('isactive', ['Y', 'N'])->default('Y');**
$table->timestamps();
});
}