我正在尝试理解以下代码之间的区别:
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');
}因此,我做了一个研究,并在Factory部分找到了make和create的解释。看似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_type和imeageble_id。但是为什么呢?这我就不明白了。
$post->image()->save(
Image::make(['path' => $path])
);发布于 2020-04-12 23:31:54
您说得对,工厂make()将实例化一个雄辩模型,而不将其持久化到数据库中。如果你的单元测试或者不需要访问数据库,你就不需要访问数据库了。
create()会将其保存在数据库中,以便在测试期间可以从数据库中检索到。
这些只能与$image = factory(Image::class)->make()或$image = factory(Image::class)->create()一起使用。不要试图在控制器中使用它们。
将控制器更改为:
$post->image()->save(['path' => $path]);https://stackoverflow.com/questions/61173675
复制相似问题