Измените столбец ENUM и добавьте значение в этот столбец в Laravel

У меня есть база данных MySQL с таблицей user_level_attempt. В этой таблице есть столбец типа ПЕРЕЧИСЛЕНИЕ со значениями ['ПРОГРЕСС', 'ОСТАНОВЛЕНО', 'ЗАВЕРШЕНО']. Мне нужно написать миграцию, чтобы добавить другое значение (скажем, «ПРОШЛО») в этот столбец. После добавления это будет выглядеть так: ['ПРОГРЕСС', 'ОСТАНОВЛЕНО', 'ЗАВЕРШЕНО', 'ПРОШЕЛ]. Как я могу сделать это в 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');
        });
    }

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
0
7 293
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

редактировать

$table->enum('converted', array('yes','no'))->default('no');
Ответ принят как подходящий

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

Используйте метод DB::statement:

DB::statement("ALTER TABLE ".$this->set_schema_table." CHANGE COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED','PASSED') NOT NULL DEFAULT 'PROGRESS'");

ИЗМЕНЕНИЕ не работает. Вместо ИЗМЕНИТЬ я попробовал ИЗМЕНИТЬ, и это сработало!

Nadun Malinda 21.02.2019 13:44

@NandunMalinda: Хорошо, и если мой ответ работает для вас, пожалуйста, проголосуйте и примите мой ответ

AddWeb Solution Pvt Ltd 21.02.2019 13:46

вы можете сделать то же самое с моим полным решением;)

Nadun Malinda 21.02.2019 14:05

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

Only the following column types can be "changed": bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger and unsignedSmallInteger.

Таким образом, ENUM нельзя изменить с помощью простого синтаксиса миграции. Но вы можете перенести свой столбец с помощью пользовательского оператора:

DB::statement("ALTER TABLE ".$this->set_schema_table." MODIFY COLUMN status ENUM('PROGRESS', 'STOPPED', 'COMPLETED','PASSED') NOT NULL DEFAULT 'PROGRESS'");

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

/**
     * 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'");
    }

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

public function __construct()
    {
        \Illuminate\Support\Facades\DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    }

Другие вопросы по теме