Заполните таблицу после выполнения миграции - PullRequest
0 голосов
/ 05 апреля 2019

Справочная информация:

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

Ранее структура данных выглядела так:

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 Ответ

2 голосов
/ 05 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...