laravel - 迁移过程中的数据
问题描述
我正在通过删除一列并将其分解到另一个表中来规范化表。在删除该列之前,我需要根据该列中的数据创建新实体。
这一切都需要通过一个部署和迁移命令来完成。所以流程需要是这样的。
- 创建新表 user_roles
- 使用来自 user->role 的数据创建 user_role 实体
- 从用户表中删除列角色
这样做的最佳实践是什么?我应该在实际迁移中运行一些数据处理代码吗?
这是 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');
});
}
解决方案
首先,Users::all()
如果有几千个users
.
我建议不要model
在迁移中进行任何数据操作。如果您将来放弃一些模型,您的迁移会发生什么?
如果您的项目已经在生产中,那么我会这样做:
- 运行
migration
创建roles
表 - 在模型中进行一些修复
user
以保存roles
到位置(如果该列存在,则保存在这里,也保存到roles_table
),'因为在您运行命令时可能会有新的注册 - 运行
artisan
命令以更改数据(将关系移动到另一个表) - 运行
migration
以删除旧列 - 从
user
模型中删除修复(保存roles
在两个地方)
推荐阅读
- c++ - 为什么这是 'a' = 2,而不是 7?
- c# - 控制尺寸有最后一个项目尺寸
- konvajs - 调整正方形/三角形上的形状描边位置
- sharepoint-online - 如何使用 ADAL JS 对 SharePoint Online 进行身份验证
- console-application - 如果用户按 Enter 键盘,为什么读取过程插入新行?
- vue.js - 子对象从对象对象传播到父对象
- mysql - MAMP Pro MySQL 8 无法启动
- sparql - SPARQL 在查询中,找到特定类后如何过滤掉超类?
- c# - 包括花费很长时间来执行
- ruby - rvm:创建文件 bin-ruby-2.6.3.tar.bz2.part 失败:权限被拒绝