Обработка данных в миграции - PullRequest
0 голосов
/ 28 сентября 2018

Я нормализую таблицу, удаляя столбец и разбивая его на другую таблицу.Перед удалением столбца мне нужно создать новые объекты на основе данных из этого столбца.

Все это нужно сделать с помощью одной команды развертывания и миграции.Таким образом, поток должен быть таким:

  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 голосов
/ 28 сентября 2018

Во-первых, Users::all() убьет процесс, если будет несколько тысяч users.

. Я бы предложил не делать никаких model или манипуляций с данными при миграциях.что произойдет с вашими миграциями, если вы в будущем отбросите некоторые из своих моделей?

И если ваш проект уже работает на производстве, я бы сделал следующее:

  1. Выполнитьmigration для создания roles таблицы
  2. Исправление в модели user для сохранения roles в местах (если столбец существует, сохраните здесь, а также сохраните в roles_table),Во время выполнения ваших команд могут быть новые регистрации
  3. Выполнить команду artisan для изменения данных (переноса взаимосвязи в другую таблицу)
  4. Выполнить migration, чтобы удалить старый столбец
  5. Удалить исправление из user модели (которая сохраняет roles в двух местах)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...