运行迁移后填充表



背景:

在我的应用程序中,用户可以拥有文件。过去,文件属于单个用户,因此我使用了一对多关系。现在,要求发生了变化,我的关系需要变得多对多。

以前,数据结构如下所示:

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.在代码尝试运行时,似乎尚未创建表。

问题:

有没有办法将转换代码放在迁移文件中以使其按预期工作?还是有更好的方法来实现这一目标?

尝试创建第二个迁移文件,在其中插入// convert old data foreach(File::all() as $file) ...部分并将两个文件一起迁移。

最新更新