Laravel - 播种关系

新手上路,请多包涵

在 Laravel 中,数据库播种一般是通过模型工厂来完成的。因此,您使用 Faker 数据为您的模型定义蓝图,并说明您需要多少个实例:

 $factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});

$user = factory(App\User::class, 50)->create();

但是,假设您的用户模型与许多其他模型有 hasMany 关系,例如 Post 模型:

 Post:
   id
   name
   body
   user_id

因此,在这种情况下,您希望将在 Users 表中播种的 实际 用户播种到您的 Posts 表中。这似乎没有被明确讨论,但我确实在 Laravel 文档中找到了以下内容:

 $users = factory(App\User::class, 3)
    ->create()
    ->each(function($u) {
         $u->posts()->save(factory(App\Post::class)->make());
    });

因此,在您的用户工厂中,您为您创建的每个用户创建了 X 个帖子。然而,在一个可能有 50 - 75 个模型与用户模型共享关系的大型应用程序中,您的用户播种器最终将最终为整个数据库播种所有关系。

我的问题是:这是处理这个问题的最佳方式吗?我唯一能想到的另一件事是首先为用户播种(不播种任何关系),然后在播种其他模型时根据需要从数据库中随机抽取用户。但是,在需要唯一的情况下,您必须跟踪使用过哪些用户。此外,这似乎会给播种过程增加很多额外的查询量。

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

阅读 364
1 个回答

您也可以使用 saveMany。例如:

 factory(User::class, 10)->create()->each(function ($user) {
    $user->posts()->saveMany(factory(Posts::class, 5)->make());
});

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

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏