无法为 Laravel 中的关系播种数据库 table

Unable to seed db table with relationship in Laravel

在 laravel 5.8 应用程序中,我想播种用户和产品 table。用户和产品之间存在这样的关系

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

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

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

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

我正在尝试使用下面的 UsersTableSeeder 同时为用户 table 和产品 table 播种

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 时,只有用户 table 被播种,我得到这个错误

Symfony\Component\Debug\Exception\FatalThrowableError : Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() must be an instance of Illuminate\Database\Eloquent\Model, instance of Illuminate\Database\Eloquent\Collection given, called in C:\Users\Elomena\Projects\Clients\Pramopro\database\seeds\UsersTableSeeder.php on line 15

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

我真的不明白为什么我会收到这个错误,因为我已经按照 https://laravel.com/docs/5.8/seeding#using-model-factories

中的确切内容进行操作

请问应该如何播种关系?

这可以解决您的问题:

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

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

错误是由这个函数引起的,它returns是一个集合而不是模型,因为它是一个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
}