Laravel 数据迁移

Posted

技术标签:

【中文标题】Laravel 数据迁移【英文标题】:Laravel data migrations 【发布时间】:2014-06-23 18:01:06 【问题描述】:

有没有办法在 Laravel 中进行数据迁移? 我找到了一些关于如何为数据库播种的说明,但它不包括我需要将一个字段拆分为多个字段或将多个字段合并为一个的情况。

一种可能的解决方案是查询数据库并循环更新每条记录。这种方法的问题是模型在迁移过程中可能无法反映表架构 (Django provides a solution for this)。

【问题讨论】:

【参考方案1】:

Laravel 内置了迁移 :) http://laravel.com/docs/migrations

简单运行

php artisan make:migration migration_name_here

它会在 app/database/migrations 下创建一个迁移。然后你可以在 up() 和 down() 方法中使用 Laravel 的数据库类。

让我们以此为例......

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 中迁移数据的相关回答:***.com/a/56306366/470749

以上是关于Laravel 数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 使用生产数据库整合迁移

laravel框架数据迁移

laravel数据库迁移

Laravel 数据迁移

Laravel中如何做数据库迁移

laravel 数据迁移实现订单列表