运行迁移后填充表格

时间:2019-04-05 19:57:17

标签: laravel laravel-5 migration

背景

在我的应用程序中,用户可以拥有文件。过去,一个文件属于一个用户,所以我使用了一对多关系。现在,要求已经改变,我的关系需要变成多对多。

以前,数据结构如下:

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 个答案:

答案 0 :(得分:2)

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