mik*_*ike 14 database laravel-4
我需要将两个字段从整数更改为外键.如何构建我的迁移呢?
Schema::create('messages', function($table)
{
$table->increments('id');
$table->integer('sender');
$table->integer('recipient');
$table->string('title');
$table->longtext('body');
$table->timestamps();
$table->softDeletes();
$table->integer('regarding');
});
Run Code Online (Sandbox Code Playgroud)
我会改sender到sender_id,recipient到recipient_id和regarding到regarding_id.
不要过多考虑它,我正在使用以下代码.在这里,我将数据类型从varchar更改为text.
public function up(){
DB::statement('ALTER TABLE items MODIFY COLUMN item_description TEXT');
DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description TEXT');
}
public function down(){
DB::statement('ALTER TABLE items MODIFY COLUMN item_description VARCHAR(255)');
DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description VARCHAR(255)');
}
Run Code Online (Sandbox Code Playgroud)
我遇到了一个类似的问题,需要将列类型从字符串更改为整数.我使用两个单独的迁移(每个迁移中都有一个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 Code Online (Sandbox Code Playgroud)
第二次迁移:
/**
* 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');
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑这个问题可以简化为单一迁移.
如果要更改列类型或修改长度等,只需调用change()方法
Schema::table('users', function ($table) {
$table->string('id')->change();
});
Run Code Online (Sandbox Code Playgroud)
并重命名列
Schema::table('users', function ($table) {
$table->renameColumn('from', 'to');
});
Run Code Online (Sandbox Code Playgroud)
您可以尝试将列重命名为临时列,$table->renameColumn('from', 'to');然后使用外键的标准创建行创建新列,最后使用控制器功能将数据从临时列复制到新列。应该可以,但我没有尝试,没有需要。
| 归档时间: |
|
| 查看次数: |
23091 次 |
| 最近记录: |