Laravel数据迁移 [英] Laravel data migrations
问题描述
是否可以在Laravel中进行数据迁移? 我找到了一些有关如何播种数据库的说明,但是没有涵盖需要将一个字段拆分为多个字段或将多个字段合并为一个字段的情况.
Is there a way to make data migrations in Laravel? I've found some instructions on how to seed the database, but it doesn't cover cases where I need to split one field into multiple fields, or merge multiple fields into one.
一种可能的解决方案是查询数据库并循环更新每个记录.这种方法的问题在于,模型在迁移过程中可能无法反映表架构(
One possible solution is to query the database and update each record on a loop. The problem with this approach is that the models may not reflect the table schema during the migration (Django provides a solution for this).
推荐答案
Laravel具有内置的迁移功能:) http: //laravel.com/docs/migrations
Laravel has migrations built in :) http://laravel.com/docs/migrations
只需运行
php artisan make:migration migration_name_here
,它将在app/database/migrations下创建一个迁移.然后,您可以在up()和down()方法中使用Laravel的数据库类.
and it will create a migration under app/database/migrations. You could then use Laravel's database classes in your up() and down() methods.
让我们以此为例...
Let's use this as an example...
class SplitColumn extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('table_name', function($table)
{
// Create new columns for table_name (1 column split into 2).
$table->string('new_column');
$table->string('new_column_b');
});
// Get records from old column.
$results = DB::table('table_name')->select('old_column')->get();
// Loop through the results of the old column, split the values.
// For example, let's say you have to explode a |.
foreach($results as $result)
{
$split_value = explode("|", $result->old_column);
// Insert the split values into new columns.
DB::table('table_name')->insert([
"new_column" => $split_value[0],
"new_column_b" => $split_value[1]
]);
}
// Delete old column.
Schema::table('table_name', function($table)
{
$table->dropColumn('old_column');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('table_name', function($table)
{
// Re-create the old column.
$table->string('old_column');
});
// Get records from old column.
$results = DB::table('table_name')->select('new_column', 'new_column_b')->get();
// Loop through the results of the new columns and merge them.
foreach($results as $result)
{
$merged_value = implode("|", [$result->new_column, $result->new_column_b]);
// Insert the split values into re-made old column.
DB::table('table_name')->insert([
"old_column" => $merged_value
]);
}
// Delete new columns.
Schema::table('table_name', function($table)
{
$table->dropColumn('new_column');
$table->dropColumn('new_column_b');
});
}
}
这篇关于Laravel数据迁移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!