Подтвердить что ты не робот

Добавление отношений к Laravel Factory Модель

Я пытаюсь добавить отношение к модели factory, чтобы выполнить некоторую серию базы данных следующим образом: примечание Я пытаюсь добавить 2 сообщения каждому пользователю

public function run()
{
   factory(App\User::class, 50)->create()->each(function($u) {
         $u->posts()->save(factory(App\Post::class, 2)->make());
   });
}

Но он бросает следующую ошибку

Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::s  
ave() must be an instance of Illuminate\Database\Eloquent\Model, instance 
of Illuminate\Database\Eloquent\Collection given

Я думаю, что это связано с сохранением коллекции. Если перезаписать код, вызвав каждую модель factory для отдельной записи, она, похоже, работает. Очевидно, это не очень элегантно, потому что, если я хочу сохранить 10 или отправить каждому пользователю, тогда мне придется декалировать 10 или строк, если я не использую какой-то цикл цикла.

public function run()
{
   factory(App\User::class, 50)->create()->each(function($u) {
     $u->posts()->save(factory(App\Post::class)->make());
     $u->posts()->save(factory(App\Post::class)->make());
   });
}

* ОБНОВЛЕНО *

Есть ли способ разместить модель factory на 3-м уровне?

public function run()
{
   factory(App\User::class, 50)
       ->create()
       ->each(function($u) {
           $u->posts()->saveMany(factory(App\Post::class, 2)
                    ->make()
                    ->each(function($p){
                          $p->comments()->save(factory(App\Comment::class)->make());
          }));
   });
}
4b9b3361

Ответ 1

Попробуйте это. Это сработало для меня:

factory(\App\Models\Auth\User::class, 300)->create()->each(function ($s) {
                    $s->spots()->saveMany(factory(\App\Models\Spots\Parking::class, 2)->create()->each(function ($u) {
                            $u->pricing()->save(factory(\App\Models\Payment\Pricing::class)->make());
                    }));
                    $s->info()->save(factory(\App\Models\User\Data::class)->make());
            });

Ответ 2

Для вложенных отношений 3-го уровня, если вы хотите создать данные с соответствующими соответствующими внешними ключами, вы можете просмотреть все результаты создания сообщений, например:

factory(App\User::class, 50)->create()->each(function($u) {
    $u->posts()
        ->saveMany( factory(App\Post::class, 2)->make() )
        ->each(function($p){
            $p->comments()->save(factory(App\Comment::class)->make());
        });
});

Ответ 3

Попробуйте это

public function run()
{
   factory(App\User::class, 50)->create()->each(function($u) {
         $u->posts()->save(factory(App\Post::class, 2)->create());
   });
}

Ответ 4

Начиная с Laravel 5.6 есть функции обратного вызова afterCreating & afterMaking, позволяющие добавлять отношения непосредственно после создания/создания:

$factory->afterCreating(App\User::class, function ($user, $faker) {
    $user->saveMany(factory(App\Post::class, 10)->make());
});

$factory->afterMaking(App\Post::class, function ($post, $faker) {
    $post->save(factory(App\Comment::class)->make());
});

Сейчас

factory(App\User::class, 50)->create()

даст вам 50 пользователей, каждый из которых имеет 10 сообщений, и каждый пост имеет один комментарий.