我遇到了类似的问题,需要将列类型从字符串更改为整数。我使用两个单独的迁移(每个都使用RAW sql语句)来管理此问题,以获得解决方案。
此外,这适用于Postgres和MySQL,因为我们处于传输过程中。
第一迁移:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('plans', function(Blueprint $table)
{
//
$table->mediumInteger('duration_change_type')->default(0)->after('duration');
});
if (Config::get('database')['default'] === 'mysql'){
// Mysql
DB::statement('update plans set duration_change_type=duration');
} else if (Config::get('database')['default'] === 'pgsql'){
// PostgreSQL
DB::statement('update plans set duration_change_type=duration::integer');
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('plans', function(Blueprint $table)
{
//
$table->dropColumn('duration_change_type');
});
}
第二迁移:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('plans', function(Blueprint $table)
{
//
$table->dropColumn('duration');
$table->renameColumn('duration_change_type', 'duration');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('plans', function(Blueprint $table)
{
// Rollback to string
$table->string('duration_change_type')->default(0)->after('duration');
});
if (Config::get('database')['default'] === 'mysql'){
// Mysql
DB::statement('update plans set duration_change_type=duration');
} else if (Config::get('database')['default'] === 'pgsql'){
// PostgreSQL
DB::statement('update plans set duration_change_type=duration::text');
}
}
在此思考现在它可以被简化成一个单一的迁移。
来源
2014-07-21 11:08:45
Ben
我已经完成了上述工作,它可以同时工作:)。 – Ben