使用 Faker 播种数据库时如何维护外键?

Rai*_*mud 0 faker laravel eloquent laravel-5

下面是我的模型工厂。

$factory->define(App\Business::class, function (Faker\Generator $faker){
return [
'name' => $faker->bs,
'slug' => $faker->slug,
'address' => $faker->streetAddress,
'phone_no' => $faker->phoneNumber,
'mobile_no' => $faker->phoneNumber,
'email' => $faker->companyEmail,
'website' => $faker->domainName,
'latitude' => $faker->latitude,
'longitude' => $faker->longitude,
'location' => $faker->city,
'business_days_from' => $faker->dayOfWeek,
'business_days_to' => $faker->dayOfWeek,
'description' => $faker->text,
'user_id' => $faker->factory(App\User::class),
];
Run Code Online (Sandbox Code Playgroud)

});

这是我的数据库播种器类

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        factory(App\Business::class, 300)->create();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我执行php artisan db:seed ...它不起作用..

这里应该有什么解决方法..任何帮助将不胜感激..

Ali*_*fat 6

你可以使用plucklists对于 laravel >= 5.2 来说已被废弃)来获取所有 id

$userIds = User::all()->pluck('id')->toArray();
Run Code Online (Sandbox Code Playgroud)

并获取 FK 列的随机 id:

'user_id' => $faker->randomElement($userIds) 
Run Code Online (Sandbox Code Playgroud)

您还可以在工厂定义中使用 Closure 属性将关系附加到模型。

    'title' => $faker->title,
    'content' => $faker->paragraph,
    'user_id' => function () {
        return factory(App\User::class)->create()->id;
    }
Run Code Online (Sandbox Code Playgroud)