У меня есть база данных 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');
});
}
Спасибо.






попробуйте что-то вроде:
редактировать
$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'");
@NandunMalinda: Хорошо, и если мой ответ работает для вас, пожалуйста, проголосуйте и примите мой ответ
вы можете сделать то же самое с моим полным решением;)
Пожалуйста, обратитесь к документации:
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');
}
ИЗМЕНЕНИЕ не работает. Вместо ИЗМЕНИТЬ я попробовал ИЗМЕНИТЬ, и это сработало!