Измените столбец ENUM и добавьте значение этому столбцу в Laravel - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть MySQL база данных с таблицей user_level_attempt.Эта таблица имеет столбец типа ENUM со значениями ['PROGRESSED', 'STOPPED', 'COMPLETED'] .Мне нужно написать миграцию, чтобы добавить другое значение (скажем, «PASSED») в этот столбец.После добавления это будет выглядеть так: ['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 голосов
/ 21 февраля 2019

Добавьте этот код в файл миграции перед схемой.

public function __construct()
    {
        \Illuminate\Support\Facades\DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    }
0 голосов
/ 21 февраля 2019

В конце концов, я выясняю, чтобы найти решение.Спасибо всем товарищам за то, что просветили меня.:)

/**
     * 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'");
    }
0 голосов
/ 21 февраля 2019

Вы должны попробовать метод DB::statement:

Использовать метод DB::statement:

DB::statement("ALTER TABLE ".$this->set_schema_table." CHANGE COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED','PASSED') NOT NULL DEFAULT 'PROGRESS'");
0 голосов
/ 21 февраля 2019

Пожалуйста, обратитесь к документации:

«Изменены» только следующие типы столбцов: 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'");
0 голосов
/ 21 февраля 2019

попробуйте что-то вроде:

изменить

$table->enum('converted', array('yes','no'))->default('no');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...