我有一个 MySQL 数据库,其中包含一个名为user_level_attempt的表。该表具有 ENUM 类型的列,该列具有 ['PROGRESSED','STOPPED','COMPLETED'] 值。我需要编写一个迁移,以向该列添加另一个值(假设为“通过”)。添加后,它会如下图所示: ['PROGRESSED','STOPPED','COMPLETED','PASSED] 。我如何在Laravel中做到这一点? 我尝试了以下解决方案,但这似乎不是一个好的做法/解决方案。
/**
* Schema table name to migrate
* @var string
*/
public $set_schema_table = 'bt_user_level_attempt';
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table($this->set_schema_table, function ($table) {
$table->dropColumn('status');
});
Schema::table($this->set_schema_table, function ($table) {
$table->enum('status', ['PROGRESS', 'STOPPED', 'COMPLETED', 'PASSED'])->default('PROGRESS')->after('effective_time_spend');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table($this->set_schema_table, function ($table) {
$table->dropColumn('status');
});
Schema::table($this->set_schema_table, function ($table) {
$table->enum('status', ['PROGRESS', 'STOPPED', 'COMPLETED'])->default('PROGRESS')->after('effective_time_spend');
});
}
谢谢。
答案 0 :(得分:1)
您应该尝试使用DB::statement
方法:
使用DB::statement
方法:
DB::statement("ALTER TABLE ".$this->set_schema_table." CHANGE COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED','PASSED') NOT NULL DEFAULT 'PROGRESS'");
答案 1 :(得分:0)
请参阅文档:
仅以下列类型可以“更改”:bigInteger,二进制,布尔值,日期,dateTime,dateTimeTz,十进制,整数,json,longText,mediumText,smallInteger,字符串,文本,时间,unsignedBigInteger,unsignedInteger和unsignedSmallInteger。
因此,不能使用简单的迁移语法来修改ENUM。但是您可以使用自定义语句来迁移您的列:
DB::statement("ALTER TABLE ".$this->set_schema_table." MODIFY COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED','PASSED') NOT NULL DEFAULT 'PROGRESS'");
答案 2 :(得分:0)
毕竟,我想出一个解决方案。感谢所有给我启发的人。 :)
/**
* Schema table name to migrate
* @var string
*/
public $set_schema_table = 'bt_user_level_attempt';
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::statement("ALTER TABLE ".$this->set_schema_table." MODIFY COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED', 'PASSED') NOT NULL DEFAULT 'PROGRESS'");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::statement("ALTER TABLE ".$this->set_schema_table." MODIFY COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED') NOT NULL DEFAULT 'PROGRESS'");
}
答案 3 :(得分:0)
将此代码添加到迁移文件中的架构之前。
public function __construct()
{
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
}
答案 4 :(得分:-1)
尝试类似的东西:
修改
$table->enum('converted', array('yes','no'))->default('no');