如何在laravel迁移中更改枚举类型列?

时间:2015-11-03 10:16:42

标签: laravel enums migration laravel-5.1

我正在使用Laravel 5.1,我有一个名为包的表,具有以下结构:

id              int(11)
weight          decimal(10,2)           
weight_unit     enum('Kg.', 'Gm.')

我想将weight_unit枚举更改为:

weight_unit enum('Grams','Kgs.','Pounds')

为此我创建了以下迁移:

public function up()
{
    Schema::table('packages', function ($table) {
        $table->enum('weight_unit', array('Grams','Kgs.','Pounds'))->nullable()->change();
    });
}

但是当我运行迁移时,我收到一个错误:

Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform  

may not support it.

如何更改此枚举?

7 个答案:

答案 0 :(得分:19)

使用DB::statement方法:

DB::statement("ALTER TABLE packages CHANGE COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");

答案 1 :(得分:6)

在为修改后的枚举列添加新的枚举值时,这对我有用。

将以下内容添加到up()方法:

DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds', 'new value') NOT NULL");

然后在down()方法中,您可以还原所做的更改:

DB::statement("ALTER TABLE packages MODIFY weight_unit ENUM('Grams', 'Kgs', 'Pounds') NOT NULL");

注意:在删除枚举值之前,需要将其更改为另一个将保留的枚举值。

答案 2 :(得分:3)

您可以向迁移添加自定义构造函数,并向Doctrine解释enum应该被视为字符串。

public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
    parent::__construct($version);

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}

答案 3 :(得分:1)

$table->enum('level', ['easy', 'hard']);

答案 4 :(得分:0)

如果您不想丢失数据,并使用新值对其进行更新,我会想到以下解决方案:

// Include old and new enum values
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Kg.', 'Gm.', 'Grams', 'Kgs', 'Pounds')");
// Replace Kg. with Kgs
Packages::where('weight_unit', 'Kg.')->update(['weight_unit' => 'Kgs']);
// Replace Gm. with Grams
Packages::where('weight_unit', 'Gm.')->update(['weight_unit' => 'Grams']);
// Delete old values
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");

这样,您可以用新值替换旧值。

答案 5 :(得分:0)

在change()调用之前添加此内容:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.7.8/angular-sanitize.js"></script>

答案 6 :(得分:0)

那些还在寻找答案的人。最新的Laravel版本7.5中已解决此问题。 看看(https://laravel-news.com/laravel-7-5-released)。