【发布时间】:2016-05-28 17:11:00
【问题描述】:
在 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();
但是,假设您的 User 模型与许多其他模型具有 hasMany 关系,例如 Post 模型:
Post:
id
name
body
user_id
因此,在这种情况下,您希望使用在您的用户表中播种的实际 用户来播种您的帖子表。这似乎没有明确讨论,但我确实在 Laravel 文档中找到了以下内容:
$users = factory(App\User::class, 3)
->create()
->each(function($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
因此,在您的用户工厂中,您为您创建的每个用户创建 X 个帖子。然而,在一个可能有 50 到 75 个模型与用户模型共享关系的大型应用程序中,您的用户播种器基本上最终会用它的所有关系播种整个数据库。
我的问题是:这是处理此问题的最佳方法吗?我能想到的唯一另一件事是先播种用户(不播种任何关系),然后在播种其他模型时根据需要从数据库中提取随机用户。但是,如果它们需要唯一,您必须跟踪使用了哪些用户。此外,这似乎会在播种过程中增加大量额外的查询量。
【问题讨论】: