背景:
在我的应用程序中,用户可以拥有文件。过去,一个文件属于一个用户,所以我使用了一对多关系。现在,要求已经改变,我的关系需要变成多对多。
以前,数据结构如下:
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
。似乎在尝试运行代码时尚未创建表。
问题:
是否可以将转换代码放入迁移文件中,以使其按预期工作?还是有更好的方法来实现这一目标?
答案 0 :(得分:2)
尝试创建第二个迁移文件,在其中插入// convert old data foreach(File::all() as $file) ...
部分,然后将两个文件一起迁移。