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

Recommended / Standard handling of Laravel Data Migrations

Laravel 附带数据库迁移,用于管理关于数据库 结构 的 CRUD 操作,但是 appropriate/recommended/standardized 处理实际迁移的方法是什么数据?

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

这个问题,我想,更多的归因于 OOP 编程结构和实践作为一个整体,而不是 laravel 具体的,但是 Laravel 是我现在正在使用的框架所以在这方面提出我的问题。

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

使用您的示例,这就是在 up() 函数中将 name 拆分为 first_namelast_name 的简单迁移:

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

...

如果您有复杂的数据更改,请查看 $table->temporary(); 选项以创建临时 tables 以使用 [=34] 进行数据操作=], and/or 使用 Artisan::call().

创建在迁移中调用的命令脚本

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

我更喜欢将数据迁移和结构迁移分开。我认为迁移文件应该只包含与架构相关的查询。

条件迁移可能包含数据更改,如果:

  • 数据取决于 deployment/migration 的时间(真的想不出一个案例,但我确定有一些 :))。
  • 我们正在进行直接影响数据的架构更改。例如:更改列的类型或创建必须在未来迁移发生之前播种的新键。

我更喜欢将数据放在种子文件中的其他原因:

  • 运行 产品迁移总是会带来一定的风险。您可以通过测试部署过程和使用一些花哨的 CD 过程来降低丢失数据的风险,但风险始终存在。

  • 你认为永远不会变的静态数据,会变的。例如,您在 2010 年开始一个新项目,项目的数据库包含 table 'countries',其中包含国家及其属性的列表。但在 2011 年之后,你会得到一个新的国家:南苏丹。您会创建新的迁移还是只更新播种机?

添加 @jon__o 的答案,您可以找到更多信息 here. Also, I will recommend that you refer to this link 他们使用基于 hashed_id 的临时表,其中临时表与普通表基本相同数据库。它具有许多对迁移有用的功能。

Schema::create('temp_mappings', function (Blueprint $table) {
        $table->temporary(); // thanks, Laravel
        $table->integer('id')->primary();
        $table->string('hash_id');
    });