Laravel 6: db:seed 用户多播种
Laravel 6: db:seed multiple seeding in user
我有以下工厂和播种机。
工厂
- UserFactory.php
- ThreadFactory.php
- ReplyFactory.php
播种机
- UsersTableSeeder.php
- ThreadTableSeeder.php
- RepliesTableSeeder.php
UserFactory.php
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});
ThreadFactory.php
$factory->define(App\Thread::class, function (Faker $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'title' => $faker->sentence,
'body' => $faker->paragraph
];
});
ReplyFactory.php
$factory->define(App\Reply::class, function (Faker $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'thread_id' => function() {
return factory(App\Thread::class)->create()->id;
},
'body' => $faker->paragraph
];
});
UsersTableSeeder.php
public function run()
{
factory(App\User::class, 50)->create();
}
ThreadTableSeeder.php
public function run()
{
factory(App\Thread::class, 50)->create()->each(function ($thread) {
factory(App\Reply::class, 10)->create(['thread_id' => $thread->id]);
});
}
RepliesTableSeeder.php
public function run()
{
// nothing in here . . .
}
DatabaseSeeder.php
public function run()
{
$this->call(ThreadTableSeeder::class);
}
我的问题是当 运行 以下命令时,我在用户 table 中得到了 550 个用户行,但其他两个 table 是正确的。
php artisan db:seed
那么,这是怎么回事?我正在使用 Laravel 6.4.1.
根据您的代码为每个线程创建一个用户。为每个回复创建一个用户。因此,对于 50 个线程和每个线程中的 10 个回复,大约 50x10=500
用户应该创建。同样在您的用户播种器 class 中,您正在创建 50 个用户,这自然会加起来 550 个用户。
现在,如果您想让您的用户保持低水平,您可以从数据库中随机获取用户并分配,而不是为每个线程/回复创建一个新用户。这是一个例子
线程工厂
$factory->define(App\Thread::class, function (Faker $faker) {
return [
'user_id' => \App\User::all()->random()->id,
'title' => $faker->sentence,
'body' => $faker->paragraph
];
});
回复工厂
$factory->define(App\Reply::class, function (Faker $faker) {
return [
'user_id' => \App\User::all()->random()->id,
'thread_id' => function() {
return factory(App\Thread::class)->create()->id;
},
'body' => $faker->paragraph
];
});
要使此工作正常进行,您必须首先为用户 table 播种任意数量的用户。
这是因为当您为每个线程定义线程工厂时,它会创建一个附加到该线程的新用户。你应该做的是只创建一个将创建用户的播种机,并为每个用户创建线程和回复
public function run()
{
factory(App\User::class, 50)->create()->each(function($user) {
factory(App\Thread::class, 50)->create(['user_id' => $user->id])
->each(function($thread) use ($user){
factory(App\Reply::class, 10)->create([
'user_id' => $user->id,
'thread_id' => $thread->id
]);
});
});
});
}
- 从创建 50 个用户开始
- 为每个用户创建 50 个线程并将
user_id
键设置为等于创建 的用户
- 然后为每个线程创建 10 个回复并将
user_id
和 thread_id
设置为刚刚创建的用户和线程
我有以下工厂和播种机。
工厂
- UserFactory.php
- ThreadFactory.php
- ReplyFactory.php
播种机
- UsersTableSeeder.php
- ThreadTableSeeder.php
- RepliesTableSeeder.php
UserFactory.php
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});
ThreadFactory.php
$factory->define(App\Thread::class, function (Faker $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'title' => $faker->sentence,
'body' => $faker->paragraph
];
});
ReplyFactory.php
$factory->define(App\Reply::class, function (Faker $faker) {
return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'thread_id' => function() {
return factory(App\Thread::class)->create()->id;
},
'body' => $faker->paragraph
];
});
UsersTableSeeder.php
public function run()
{
factory(App\User::class, 50)->create();
}
ThreadTableSeeder.php
public function run()
{
factory(App\Thread::class, 50)->create()->each(function ($thread) {
factory(App\Reply::class, 10)->create(['thread_id' => $thread->id]);
});
}
RepliesTableSeeder.php
public function run()
{
// nothing in here . . .
}
DatabaseSeeder.php
public function run()
{
$this->call(ThreadTableSeeder::class);
}
我的问题是当 运行 以下命令时,我在用户 table 中得到了 550 个用户行,但其他两个 table 是正确的。
php artisan db:seed
那么,这是怎么回事?我正在使用 Laravel 6.4.1.
根据您的代码为每个线程创建一个用户。为每个回复创建一个用户。因此,对于 50 个线程和每个线程中的 10 个回复,大约 50x10=500
用户应该创建。同样在您的用户播种器 class 中,您正在创建 50 个用户,这自然会加起来 550 个用户。
现在,如果您想让您的用户保持低水平,您可以从数据库中随机获取用户并分配,而不是为每个线程/回复创建一个新用户。这是一个例子
线程工厂
$factory->define(App\Thread::class, function (Faker $faker) {
return [
'user_id' => \App\User::all()->random()->id,
'title' => $faker->sentence,
'body' => $faker->paragraph
];
});
回复工厂
$factory->define(App\Reply::class, function (Faker $faker) {
return [
'user_id' => \App\User::all()->random()->id,
'thread_id' => function() {
return factory(App\Thread::class)->create()->id;
},
'body' => $faker->paragraph
];
});
要使此工作正常进行,您必须首先为用户 table 播种任意数量的用户。
这是因为当您为每个线程定义线程工厂时,它会创建一个附加到该线程的新用户。你应该做的是只创建一个将创建用户的播种机,并为每个用户创建线程和回复
public function run()
{
factory(App\User::class, 50)->create()->each(function($user) {
factory(App\Thread::class, 50)->create(['user_id' => $user->id])
->each(function($thread) use ($user){
factory(App\Reply::class, 10)->create([
'user_id' => $user->id,
'thread_id' => $thread->id
]);
});
});
});
}
- 从创建 50 个用户开始
- 为每个用户创建 50 个线程并将
user_id
键设置为等于创建 的用户
- 然后为每个线程创建 10 个回复并将
user_id
和thread_id
设置为刚刚创建的用户和线程