#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) ...
часть и перенесите два файла вместе.