【问题标题】:Unable to seed db table with relationship in Laravel无法在 Laravel 中为具有关系的数据库表播种
【发布时间】:2019-11-14 03:07:42
【问题描述】:

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

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 中的确切内容

请问应该如何进行人际关系播种?

【问题讨论】:

    标签: php laravel laravel-5.8


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

      这可以解决你的问题:

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

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 2020-10-08
        • 2018-11-10
        • 2018-04-04
        • 2019-08-31
        • 2013-06-27
        • 1970-01-01
        • 2016-05-28
        • 2014-01-26
        相关资源
        最近更新 更多