更改ENUM列并在Laravel中向该列添加值

时间:2019-02-21 12:07:15

标签: php laravel enums eloquent database-migration

我有一个 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');
        });
    }

谢谢。

5 个答案:

答案 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');