我正在通过删除列并将其在另一个表中拆分来规范化表。在删除该列之前,我需要根据该列中的数据创建新实体。
所有这些都需要使用一个单独的deploy and migration命令来完成。因此流程需要像这样。
执行此操作的最佳实践是什么? 我应该在实际迁移中运行一些数据处理代码吗?
这是犹太洁食,还是我应该写一条命令进行数据处理,然后从该命令中删除该列。这感觉有点不直观,因为如果将应用程序新鲜部署在新服务器上,则这不会自动发生(因为在迁移过程中不会删除该列)
这是我想做的事的样机。
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');
});
}
答案 0 :(得分:1)
首先,如果有Users::all()
的数千个,users
将终止该进程。
我建议不要在迁移中进行任何model
或数据操作。如果将来要删除某些模型,迁移将发生什么?
如果您的项目已经在生产中,那么我会这样做:
migration
以创建roles
表user
模型中进行一些修复,以将roles
保存到位置(如果该列存在,则保存在这里,还保存到roles_table
),“请在运行时命令中可以有新的注册信息artisan
命令以更改数据(将关系移动到另一个表)migration
删除旧列user
模型中删除修订(将roles
保存在两个位置)