【发布时间】:2019-04-05 19:57:16
【问题描述】:
背景:
在我的应用程序中,用户可以拥有文件。以前是一个文件属于一个用户,所以我使用了一对多的关系。现在,要求发生了变化,我的关系需要变成多对多。
以前,数据结构是这样的:
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。在代码尝试运行时,似乎尚未创建表。
问题:
有没有办法可以将转换代码放入迁移文件中以使其按预期工作?还是有更好的方法来实现这一点?
【问题讨论】:
标签: laravel laravel-5 migration