在 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 许可协议
您也可以使用 saveMany。例如: