试图理解model::make()x model::create()



我正在努力理解以下代码之间的区别:

Image::make(['path' => $path]);

Image:create(['path' => $path]);

关系

//Image Model
/**
* @return MorphTo
*/
public function imageable(): MorphTo
{
return $this->morphTo();
}
//Post Model
/**
* @return MorphOne
*/
public function image(): MorphOne
{
return $this->morphOne(Image::class, 'imageable');
}

所以,我做了一项研究,在工厂部分找到了制作和创建的解释。看起来make()创建了一个对象实例而不保存它。create()一次创建并保存对象。

示例中的代码是如何工作的?

上面是完整的片段。在这种情况下,代码无法按预期工作。

$post->image()->save(
Image::create([
'path' => $path,
])
);

它抛出了一个异常:

SQLSTATE[HY000]: General error: 1364 Field 'imageable_type' doesn't have a default value (SQL: insert into `images` (`path`, `updated_at`, `created_at`) values (thumbnails/RYBkyxFLNzxwbI5eTnzx2w4QqzOfRAUj7h2SgXQM.jpeg, 2020-04-12 15:41:05, 2020-04-12 15:41:05))

现在,使用make(),它就可以工作了。无需手动添加imageable_typeimeageble_id。但为什么呢?这我不能理解。

$post->image()->save(
Image::make(['path' => $path])
);

没错,Factorymake()将实例化Eloquent Model,而不将其持久化到数据库中。如果你的单元测试或不需要访问数据库,你就不必了。

create()将把它保存在数据库中,以便在测试期间可以从数据库中检索它。

这些只能与$image = factory(Image::class)->make()$image = factory(Image::class)->create()一起使用。不要试图在控制器中使用它们。

将控制器更改为:

$post->image()->save(['path' => $path]);

最新更新