用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型
最近,我一直试图使用Laravel种子模型工厂和Faker来种子我的数据库。用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型
对于简单的模式,它只是一件轻而易举的工作:)。然而,其中涉及外键的复杂的数据库模式和表之间的关系工作时,我遇到了几个问题:
- 一对一
- 一对多
- 多对多
...就像链接中描述的那样: Laravel 5.1 foreign keys in model factory。
在这个话题中,official documentation建议运行数据库种子是这样的:
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...
];
});
回答:
这里就是让人际关系是方式比随机分配给用户,特别是如果你需要额外的信息发送到这个模型更好的解决方案。
$factory->define(App\Post::class, function (Faker\Generator $faker) { $user = factory('App\Models\User')->create(['email' => '[email protected],]);
// do your relationships here (...)
return [
'user_id' => $user->id,
'title' => $faker->sentence,
'body' => $faker->paragraph,
];
}
我看到与使用匿名函数的另一个例子
$factory->define(App\Post::class, function (Faker\Generator $faker) { return [
'user_id' => function() {
return factory(App\User::class)->create()->id;
},
'title' => $faker->sentence,
'body' => $faker->paragraph,
];
}
来源:https://laracasts.com/series/laravel-from-scratch-2017/episodes/22
以上是 用模型工厂,一对一和一对多关系定义Laravel外键而不会创建不必要的模型 的全部内容, 来源链接: utcz.com/qa/261716.html