Я нормализую таблицу, удаляя столбец и разбивая его на другую таблицу.Перед удалением столбца мне нужно создать новые объекты на основе данных из этого столбца.
Все это нужно сделать с помощью одной команды развертывания и миграции.Таким образом, поток должен быть таким:
- Создать новую таблицу user_roles
- Создать сущности user_role с данными из user-> role
- Удалить роль столбца из таблицы пользователя
Какая самая лучшая практика для этого?Должен ли я запускать какой-либо код обработки данных при фактической миграции?
Является ли это кошерным или я должен просто написать команду, которая будет выполнять обработку данных, а затем удалить столбец из этой команды.Это кажется немного противоречивым, поскольку это не произойдет автоматически, если приложение будет развернуто заново на новом сервере (поскольку столбец не удаляется при миграции)
Вот макет того, что я хочу сделать,
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');
});
}