Laravel 数据迁移的推荐/标准处理

min*_*nce 7 data-migration database-migration conceptual laravel

Laravel 附带了数据库迁移,用于管理有关数据库结构的CRUD 操作,但是处理实际数据迁移的适当/推荐/标准化方法是什么?

我的问题是,数据迁移是否应该直接在数据库迁移文件中进行?应该是播种机吗?它应该是从数据库迁移中分派的作业吗?这样的逻辑该何去何从。有时,根据数据库迁移的作用,这些数据迁移会变得异常复杂,本着最大化可读性和保持职责分离的精神,我觉得逻辑属于其他地方。

我想,这个问题更多地归因于 OOP 编程结构和整个实践,而不是 Laravel 特定的,但 Laravel 是我现在正在使用的框架,因此在这方面提出了我的问题。

小智 9

我已经这样做了几次,除非我们谈论的是数百万条记录,否则我会在迁移up()down()功能中这样做。我同意你的看法,感觉在迁移中应该有一个明确定义的功能。我们希望在触发表上的另一个迁移之前更改数据,所以我觉得需要立即完成。

使用你的例子,这是一个简单的迁移将是什么样子的分裂namefirst_namelast_nameup()功能:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

class Test extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('last_name')->after('name');
            $table->string('first_name')->after('name');
        });

        DB::statement("UPDATE users SET first_name = SUBSTRING_INDEX(name, ' ', 1), last_name = SUBSTRING(name from instr(name, ' ') + 1)");

        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('name');
        });
    }

...
Run Code Online (Sandbox Code Playgroud)

如果您有复杂的数据更改,请查看$table->temporary();创建临时表以使用 SQL 进行数据操作的选项,和/或使用Artisan::call().

$table->temporary()https Artisan::call() : //laravel.com/docs/8.x/migrations#database-connection-table-optionshttps : //laravel.com/docs/8.x/artisan#programmatically-executing-commands