使用 Laravel 5.4 播种功能时出错

Posted

技术标签:

【中文标题】使用 Laravel 5.4 播种功能时出错【英文标题】:Error when using Laravel 5.4 Seeder Function 【发布时间】:2017-08-21 04:19:05 【问题描述】:

类型错误:参数 1 传递给 Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() 必须是 Illuminate\Database\Eloquent\Model 的实例, Illuminate\Database\Eloquent\Collection 给定

我计划为具有个人资料的用户生成假日期。我有两个模型:用户和个人资料。我已经完成了彼此的关系。但是当我执行它时,问题就来了。以上是我运行 Seeder 时的错误。

这是发现错误的类。

public function run()

    factory(App\User::class, 40)->create()->each(
        function($user) 
            $user->profile()->save(
                factory(App\Profile::class, 1)->make()
            );
        
    );

【问题讨论】:

【参考方案1】:

我猜你使用的是 Laravel 5.4。

对 factory() 辅助方法进行了修改。来自文档:

工厂助手 调用 factory(User::class, 1)->make() 或 factory(User::class, 1)->create() 现在将返回一个包含一项的集合。以前,这将返回单个模型。如果未提供金额,此方法将仅返回单个模型。

Laravel 5.3 to 5.4 updgrade guide

这意味着你应该从你的 factory() 调用中删除 1。

public function run()
factory(App\User::class, 40)->create()->each(
    function($user) 
        $user->profile()->save(
            factory(App\Profile::class)->make()
        );
    
);

编辑 1:您必须更改此行:

factory(App\Profile::class, 1)->make()

到这里

factory(App\Profile::class)->make()

【讨论】:

感谢您的回复。是的,我正在使用 laravel 5.4。你能具体说明应该删除什么吗?因为我是初学者,不知道它是如何工作的。【参考方案2】:

通过调用方法获取$user->profile() 的关系,会将相关模型作为Collection 返回。您可以使用$user->profile()->first() 来获得Illuminate\Database\Eloquent\Model 类型的单个结果,或者只使用$user->profile 而不使用()

【讨论】:

以上是关于使用 Laravel 5.4 播种功能时出错的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4中的动态播种

在 laravel 5.4 中测试文件上传时出错

更新到 Laravel 5.4 时出错

在 Laravel 5.4 上安装 cartalyst/tags 时出错

Laravel 5.4 - 删除外键的唯一约束时出错[重复]

新 Laravel 5.4 上的“npm run dev”命令出错