首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试理解model::make() x model::create()

尝试理解model::make() x model::create()
EN

Stack Overflow用户
提问于 2020-04-12 23:16:07
回答 1查看 46关注 0票数 0

我正在尝试理解以下代码之间的区别:

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

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

关系

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

因此,我做了一个研究,并在Factory部分找到了make和create的解释。看似make()会创建对象的一个实例,而不保存它。create()一次创建并保存对象。

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

上面是完整的代码片段。在这种情况下,代码不能像预期的那样工作。

代码语言:javascript
复制
$post->image()->save(
                Image::create([
                    'path' => $path,
                ])
            );

它抛出异常:

代码语言:javascript
复制
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。但是为什么呢?这我就不明白了。

代码语言:javascript
复制
$post->image()->save(
                Image::make(['path' => $path])
            );
EN

回答 1

Stack Overflow用户

发布于 2020-04-12 23:31:54

您说得对,工厂make()将实例化一个雄辩模型,而不将其持久化到数据库中。如果你的单元测试或者不需要访问数据库,你就不需要访问数据库了。

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

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

将控制器更改为:

代码语言:javascript
复制
$post->image()->save(['path' => $path]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61173675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档