如何更改 laravel 迁移中的枚举类型列?
How to change enum type column in laravel migration?
我正在使用 Laravel 5.1 并且我有一个 table 具有这种结构的调用包:
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.
如何更改此枚举?
使用DB::statement
方法:
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");
您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释 enum
应该像字符串一样对待。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
在向修改后的枚举列添加新枚举值时,这对我有用。
将以下内容添加到 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");
注意:在删除枚举值之前,需要将其更改为将保留的另一个枚举值。
$table->enum('level', ['easy', 'hard']);
如果您不想丢失数据并使用我想出的新值更新它:
// 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')");
这样您就可以用新值替换旧值。
在 change() 调用之前添加:
DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
那些还在寻找答案的人。此问题已在最新的 Laravel 7.5 版中修复
看看(https://laravel-news.com/laravel-7-5-released).
我可以通过删除和添加约束来解决这个问题。这确保了我现有的数据也完好无损。
DB::statement("ALTER TABLE purchases DROP CONSTRAINT purchases_ref_check");
$types = ['single', 'monthly', 'biannual', 'amount', 'other'];
$result = join( ', ', array_map(function( $value ){ return sprintf("'%s'::character varying", $value); }, $types) );
DB::statement("ALTER TABLE purchases add CONSTRAINT purchases_ref_check CHECK (ref::text = ANY (ARRAY[$result]::text[]))");
我正在使用 Laravel 5.1 并且我有一个 table 具有这种结构的调用包:
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.
如何更改此枚举?
使用DB::statement
方法:
DB::statement("ALTER TABLE packages MODIFY COLUMN weight_unit ENUM('Grams', 'Kgs', 'Pounds')");
您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释 enum
应该像字符串一样对待。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
在向修改后的枚举列添加新枚举值时,这对我有用。
将以下内容添加到 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");
注意:在删除枚举值之前,需要将其更改为将保留的另一个枚举值。
$table->enum('level', ['easy', 'hard']);
如果您不想丢失数据并使用我想出的新值更新它:
// 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')");
这样您就可以用新值替换旧值。
在 change() 调用之前添加:
DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
那些还在寻找答案的人。此问题已在最新的 Laravel 7.5 版中修复 看看(https://laravel-news.com/laravel-7-5-released).
我可以通过删除和添加约束来解决这个问题。这确保了我现有的数据也完好无损。
DB::statement("ALTER TABLE purchases DROP CONSTRAINT purchases_ref_check");
$types = ['single', 'monthly', 'biannual', 'amount', 'other'];
$result = join( ', ', array_map(function( $value ){ return sprintf("'%s'::character varying", $value); }, $types) );
DB::statement("ALTER TABLE purchases add CONSTRAINT purchases_ref_check CHECK (ref::text = ANY (ARRAY[$result]::text[]))");