【问题标题】:How can I maintain foreign keys when seeding database with Faker?使用 Faker 播种数据库时如何维护外键?
【发布时间】:2016-05-04 17:09:20
【问题描述】:

下面是我的模型工厂。

$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),
];

});

这是我的数据库播种器类

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

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

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

【问题讨论】:

  • 有错误吗?您是否尝试过转储工厂创建的结果?
  • 是的,我做到了,它说 [InvalidArgumentException] Unknown formatter "factory" @MarkDavidson
  • 啊,我明白了。查看文档laravel.com/docs/5.2/testing#model-factories 将关系添加到模型部分应该可以帮助您完成所需的内容。

标签: laravel laravel-5 eloquent faker


【解决方案1】:

您可以使用 pluck 获取所有 ID(lists 对于 laravel >= 5.2 已弃用)

$userIds = User::all()->pluck('id')->toArray();

并为 FK 列获取一个随机 id:

'user_id' => $faker->randomElement($userIds) 

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

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

【讨论】:

    【解决方案2】:

    我刚刚找到了解决方法..我替换了

    'user_id' => $faker->factory(App\User::class),
    

    'user_id' => $faker->randomElement(User::lists('id')->toArray()),
    

    这解决了现在的问题..

    【讨论】:

    • 为我醒来,使用 pluck() 而不是 lists() 'user_id' => $faker->randomElement(User::pluck('id')->toArray()),
    猜你喜欢
    • 2014-03-01
    • 2010-10-14
    • 1970-01-01
    • 2020-10-20
    • 2023-03-03
    • 2018-05-08
    • 2015-06-02
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多