在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
中的确切内容请问如何建立关系种子?
答案 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
}