Справочная информация:
В моем приложении пользователи могут владеть файлами. Раньше файл принадлежал одному пользователю, поэтому я использовал отношение «один ко многим». Теперь требования изменились, и мои отношения должны стать многими ко многим.
Ранее структура данных выглядела так:
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
. Кажется, что таблица еще не была создана во время попытки выполнения кода.
Вопрос:
Есть ли способ поместить код преобразования в файл миграции, чтобы он работал так, как ожидалось? Или есть лучший способ добиться этого?