Laravel即使无法填充也可以在迁移中填充模型中的属性

时间:2019-07-06 14:15:20

标签: laravel laravel-5

我有两个实体:

  1. 人员,其中包含“ workspace_id”列
  2. PersonRevision,其中没有workspace_id列

在迁移中,我有这个:

$persons = Person::all();

foreach ($persons as $person) {
    $revision = new PersonRevision;
    $revision->fill($person->getAttributes());
    $revision->save();
}

PersonRevision在workspace_id属性中没有fillable。但是由于某种原因,我得到了一个错误:column "workspace_id" of relation "person_revisions" does not exist

此外,如果我第二次运行迁移(只需再次键入php artisan migrate),就可以正常工作。

可能是什么原因?我知道我可以手动列出需要填写的属性,或使用array_except,但这很不方便,无法回答为什么会发生这种情况。

2 个答案:

答案 0 :(得分:0)

您能检查一下实际执行的sql语句吗?在我看来,您的数据库似乎还不包含workspace_id,但是您的模型确实希望它存在。即使不填写workspace_id,从雄辩的模型中生成的查询也可能会尝试使用值null对其进行更新,如果不存在,则无法执行。

由于这样的问题,最好不要在数据库迁移中使用雄辩的模型,而应使用原始sql。

答案 1 :(得分:0)

Laravel SeedCommand handle() 函数与 Model::ungarded() 一起运行,它强制所有道具都是可填充的。当 unguarded 为 true 时,无论可填充数组如何,它都会自动填充。

public function isFillable($key)
{
    if (static::$unguarded) {
        return true;
    }
    [...]
}

只需将此添加到您的播种机文件 Model::reguard();

相关问题