Заполнить таблицу после выполнения миграции

#laravel #laravel-5 #migration

#laravel #laravel-5 #миграция

Вопрос:

Предыстория:

В моем приложении пользователи могут владеть файлами. Раньше файл принадлежал одному пользователю, поэтому я использовал отношение «один ко многим». Теперь требования изменились, и мои отношения должны стать «многие ко многим».

Ранее структура данных выглядела следующим образом:

 files
(
  id,
  user_id
  ...
);
  

и новая структура данных выглядит следующим образом:

 files
(
  id,
  ...
);

file_user
(
  id,
  file_id,
  user_id,
);
  

Проблема:

Я создал миграцию, чтобы изменить свою структуру данных, вот так:

 public function up()
{
    Schema::create('file_user', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();

        $table->string('file_id', 36);
        $table->string('user_id', 36);
    });
}
  

Затем я настроил взаимосвязь в соответствующих моделях. Теперь мне нужно преобразовать старые данные в новую структуру данных. Это означает, что нужно взять все существующие файлы и создать новую запись в таблице file_user. Сам код прост:

 foreach(File:all() as $file) { 
    $file->users()->attach($file->user_id);
}
  

Я хочу запустить этот код вместе с миграцией, чтобы после запуска миграции таблица была заполнена. Однако, когда я пытаюсь поместить ее непосредственно в файл миграции следующим образом:

 public function up()
{
    // create table
    Schema::create('file_user', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();

        $table->string('file_id', 36);
        $table->string('user_id', 36);
    });

    // convert old data
    foreach(File:all() as $file) { 
        $file->users()->attach($file);
    }
}
  

Я получаю исключение:
PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "file_user" does not exist . Похоже, что таблица еще не была создана на момент, когда код пытается запуститься.

Вопрос:

Есть ли способ, которым я могу поместить код преобразования в файл миграции, чтобы он работал так, как ожидалось? Или есть лучший способ добиться этого?

Ответ №1:

Попробуйте создать второй файл миграции, вставьте туда // convert old data foreach(File::all() as $file) ... часть и перенесите два файла вместе.