迁移过程中的数据

时间:2018-09-28 08:12:15

标签: laravel laravel-5

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

所有这些都需要使用一个单独的deploy and migration命令来完成。因此流程需要像这样。

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

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

这是犹太洁食,还是我应该写一条命令进行数据处理,然后从该命令中删除该列。这感觉有点不直观,因为如果将应用程序新鲜部署在新服务器上,则这不会自动发生(因为在迁移过程中不会删除该列)

这是我想做的事的样机。

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

1 个答案:

答案 0 :(得分:1)

首先,如果有Users::all()的数千个,users将终止该进程。

我建议不要在迁移中进行任何model或数据操作。如果将来要删除某些模型,迁移将发生什么?

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

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