Перенос данных Laravel

Есть ли способ сделать миграции данных в Laravel? Я нашел несколько инструкций о том, как засеять базу данных, но не охватывает случаи, когда мне нужно разделить одно поле на несколько полей или объединить несколько полей в один.

Одним из возможных решений является запрос базы данных и обновление каждой записи в цикле. Проблема с этим подходом заключается в том, что модели могут не отражать схему таблицы во время миграции (Django предоставляет решение для этого).

Ответ 1

В Laravel встроены миграции :) http://laravel.com/docs/migrations

Просто беги

php artisan make:migration migration_name_here

и он создаст миграцию в приложении/базе данных/миграции. Затем вы можете использовать классы базы данных Laravel в ваших методах up() и down().

Давайте использовать это как пример...

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 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');
        });
    }
}

Ответ 2

Как только это будет твердо и, вероятно, лучший ответ, я просто создам набор запросов в вашем любимом инструменте базы данных, например:

введите описание изображения здесь

Это простое решение, если вы не работаете в команде. Миграция определенно намного лучше, но иногда набор запросов будет быстрее.