and*_*dcl 9 php faker laravel laravel-5 laravel-seeding
最近,我一直试图通过Model Factories和Faker使用Laravel播种来播种我的数据库.
对于简单的模式,让它工作变得轻而易举:).但是,在处理涉及外键和表关系的复杂数据库模式时,我遇到了一些问题:
...就像链接中描述的那样: 模型工厂中的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,那么所有这些帖子都不会链接到用户,并且永远不会用于测试和开发......
为了找到处理这种情况的方法,我找到了一个适合我的功能解决方案,避免了那些'孤儿'模型的不必要的创建......
我想与大家分享,所以在答案中只是解释:).
and*_*dcl 25
所以这是我的解决方案:
该示例涉及:
用户和帖子(用于说明一对多关系)
// 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...
    ];
});
小智 7
这是一种建立关系的解决方案,比分配随机用户要好得多,尤其是当您需要向此模型发送额外信息时。
$factory->define(App\Post::class, function (Faker\Generator $faker) {
    $user = factory('App\Models\User')->create(['email' => 'email@test.com',]);
    // 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
这就是我在工厂中用于 FK 的方法
return [
    'user_id' => $this->faker->randomElement(User::pluck('id')),
    ...
];
注意:确保您的工厂按正确的顺序运行