Невозможно заполнить таблицу базы данных отношениями в Laravel - PullRequest
1 голос
/ 03 июля 2019

В приложении 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: Аргумент 1, передаваемый в Illuminate \ Database \ Eloquent \ Relations \ HasOneOrMany :: save (), должен быть экземпляром Illuminate \ Database \ Eloquent \ Model, заданным экземпляром Illuminate \ Database \ Eloquent \ Collection, вызываемым в C: \ Users \Elomena \ Projects \ Clients \ Pramopro \ database \ seed \ UsersTableSeeder.php в строке 15

Это строка 15 $user->products()->save(factory(App\Product::class, 3)->make());

Я действительно не понимаю, почему я получаюэта ошибка, поскольку я следовал точному тhing from https://laravel.com/docs/5.8/seeding#using-model-factories

Пожалуйста, как сделать посев с отношениями?

Ответы [ 2 ]

5 голосов
/ 03 июля 2019

Это может решить вашу проблему:

public function run()
{
    factory(App\User::class, 3)->create()->each(function ($user) {
        $user->products()->saveMany(factory(App\Product::class, 3)->create());
    });
}
1 голос
/ 03 июля 2019

Сообщение об ошибке предполагает, что вы используете коллекцию вместо модели.

Ошибка вызвана этой функцией, она возвращает коллекцию, а не модель, потому что это 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...