向 Laravel 工厂模型添加关系

新手上路,请多包涵

我正在尝试添加与工厂模型的关系以进行一些数据库播种,如下所示 - 注意我正在尝试向每个用户添加 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

我认为这与保存收藏有关。如果通过分别为帖子调用每个工厂模型来重新编写代码,它似乎可以工作。显然这不是很优雅,因为如果我想坚持 10 或发布给每个用户,那么我必须 decalare 10 或行,除非我使用某种 for 循环。

 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());
   });
}

\* 更新 *

有没有办法将模型工厂嵌套到第三层深?

 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());
          }));
   });
}

原文由 adam78 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 238
1 个回答

从 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 个帖子,每个帖子有一个评论。

原文由 Adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏