最近,我一直在尝试通过 Model Factories 和 Faker 使用 Laravel 播种来为我的数据库播种。
对于简单的模式,让它工作是轻而易举的:)。然而,我在处理复杂的数据库模式时遇到了几个问题,其中涉及外键和表关系:
...就像链接中描述的那样:模型工厂中的 Laravel 5.1 外键 https://stackoverflow.com/questions/32425420/laravel-5-1-foreign-keys-in-model-factory.
在本主题中,官方文档 https://laravel.com/docs/5.3/seeding#using-model-factories建议像这样运行数据库种子:
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
}
...但是这个解决方案有一个问题:当处理许多数据库表并运行许多种子(它们之间有许多关系)时,通常会创建许多不必要的模型使用这种方法。例如,如果我们在上面的示例之一之前运行 PostsTableSeeder.php,则所有这些帖子都不会链接到用户,并且永远不会在测试和开发中使用...
因此,在寻找一种方法来处理这种情况时,我提出了一种适合我的功能解决方案,并避免不必要地创建那些“孤儿”模型......
我想与大家分享,所以只是在答案中解释:)。
所以这是我的解决方案:
该示例涉及:
-
用户和个人资料(用于说明一对一关系)
-
用户和帖子(用于说明一对多关系)
// ONE TO ONE relationship (with Users already created)
$factory->define(App\Profile::class, function (Faker\Generator $faker) {
return [
'user_id' => $faker->unique()->numberBetween(1, App\User::count()),
// Rest of attributes...
];
});
// ONE TO MANY relationship (with Users already created)
$factory->define(App\Posts::class, function (Faker\Generator $faker) {
$users = App\User::pluck('id')->toArray();
return [
'user_id' => $faker->randomElement($users),
// Rest of attributes...
];
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)