首页 > 解决方案 > 迁移过程中的数据

问题描述

我正在通过删除一列并将其分解到另一个表中来规范化表。在删除该列之前,我需要根据该列中的数据创建新实体。

这一切都需要通过一个部署和迁移命令来完成。所以流程需要是这样的。

  1. 创建新表 user_roles
  2. 使用来自 user->role 的数据创建 user_role 实体
  3. 从用户表中删除列角色

这样做的最佳实践是什么?我应该在实际迁移中运行一些数据处理代码吗?

这是 kosher 还是我应该只写一个命令来处理数据,然后从这个命令中删除该列。这感觉有点违反直觉,因为如果将应用程序重新部署在新服务器上,这不会自动发生(因为在迁移中不会删除该列)

这是我想做的一个模型。

 public function up()
{
    Schema::create('user_roles', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('role_id')->unsigned();
        $table->integer('organisation_id')->unsigned();
        $table->timestamps();

        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade')
            ->onUpdate('cascade');

        $table->foreign('role_id')
            ->references('id')->on('roles')
            ->onDelete('cascade')
            ->onUpdate('cascade');

        $table->foreign('organisation_id')
            ->references('id')->on('organisations')
            ->onDelete('cascade')
            ->onUpdate('cascade');
    });

    // MOCKUP CODE FOR creating user_roles
    $users = User::all();
    foreach ($users as $user) {
        $userRole = new UserRole();
        $userRole->user_id = $user->id;
        $userRole->role_id = $user->role;
        $userRole->organisation_id = $user->getOrganisation();
        $userRole->save();
    }

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

标签: laravellaravel-5

解决方案


首先,Users::all()如果有几千个users.

我建议不要model在迁移中进行任何数据操作。如果您将来放弃一些模型,您的迁移会发生什么?

如果您的项目已经在生产中,那么我会这样做:

  1. 运行migration创建roles
  2. 在模型中进行一些修复user以保存roles到位置(如果该列存在,则保存在这里,也保存到roles_table),'因为在您运行命令时可能会有新的注册
  3. 运行artisan命令以更改数据(将关系移动到另一个表)
  4. 运行migration以删除旧列
  5. user模型中删除修复(保存roles在两个地方)

推荐阅读