无法在Laravel中为具有关系的数据库表播种

时间:2019-07-03 12:11:59

标签: php laravel laravel-5.8

在laravel 5.8应用程序中,我想为用户和产品表添加种子。这样的用户和产品之间存在联系

User.php模型(用户可以拥有一个或多个产品)

public function products()
{
    return $this->hasMany(Product::class, 'user_id');
}

Product.php模型(一种产品可以属于一个或多个用户)

public function users()
{
    return $this->belongsToMany(User::class);
}

我正尝试使用下面的UsersTableSeeder为用户表和产品表同时设置种子

public function run()
{
    factory(App\User::class, 3)->create()->each(function ($user) {
        $user->products()->save(factory(App\Product::class, 3)->make());
    });
}

“ DatabaseSeeder”看起来像这样

public function run()
{
    $this->call(UsersTableSeeder::class);
}

当我运行命令php artisan db:seed时,仅种子了users表,并且出现此错误

  

Symfony \ Component \ Debug \ Exception \ FatalThrowableError:传递给Illuminate \ Database \ Eloquent \ Relations \ HasOneOrMany :: save()的参数1必须是Illuminate \ Database \ Eloquent \ Model的实例,    给定的Illuminate \ Database \ Eloquent \ Collection,在第15行的C:\ Users \ Elomena \ Projects \ Clients \ Pramopro \ database \ seeds \ UsersTableSeeder.php中调用

这是第15行$user->products()->save(factory(App\Product::class, 3)->make());

我真的不明白为什么我得到了这个错误,因为我遵循了https://laravel.com/docs/5.8/seeding#using-model-factories

中的确切内容

请问如何建立关系种子?

2 个答案:

答案 0 :(得分:5)

这可以解决您的问题:

public function run()
{
    factory(App\User::class, 3)->create()->each(function ($user) {
        $user->products()->saveMany(factory(App\Product::class, 3)->create());
    });
}

答案 1 :(得分:1)

该错误消息表明您使用的是集合而不是模型。

此功能引起的错误,因为它是hasMany关系,所以它返回一个集合而不是一个模型。

public function products()
{
    return $this->hasMany(Product::class, 'user_id');
}

因此,您应该将播种机更改为saveMany,而不是save

public function run()
{
    factory(App\User::class, 3)->create()->each(function ($user) {
        $user->products()->saveMany(factory(App\Product::class, 3)->create());
    });                   // ^ saveMany instead of save
}