最近我一直在尝试使用 Laravel 的模型工厂和 Faker,在种子数据库中进行数据填充。
对于简单的架构,使其工作起来就像呼吸一样自然。但是,在处理涉及外键和表关系的复杂DB架构时,我遇到了几个问题:
- 一对一
- 一对多
- 多对多
...就像链接中描述的那样: Laravel 5.1 模型工厂中的外键.
在这个主题中,官方文档建议按照以下方式运行数据库种子:
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
}
...但是这种解决方案有一个问题:当使用许多数据库表并运行许多种子时(它们之间有许多关系),使用这种方法通常会创建许多不必要的模型。例如,如果我们在上面的示例之前运行了PostsTableSeeder.php,则所有这些帖子都没有与用户相关联,并且永远不会在测试和开发中使用...
因此,在寻找处理这种情况的方法时,我想出了一种对我有效并避免创建那些“孤立”模型的功能性解决方案...
我希望与大家分享这个方法,所以它只是在回答中解释了。