Laravel |数据库播种工厂

时间:2018-03-16 21:01:23

标签: php laravel eloquent migration faker

我目前正在了解Laravel工厂及其工作原理。到目前为止,我发现它们非常有用!

我正在为企业创建一个目录,所以我正在尝试在开发过程中播种一些虚拟数据。

目前我已经拥有它,所以它与用户一起创建了一个企业,但现在它开始变得棘手,这就是我在这里发帖的原因。

通过业务,我还需要创建类别,位置,图像和联系人。我想他们都会以同样的方式工作,所以我只会询问类别。

基本上我想要做的是创建业务时我想每10个业务创建一个类别,因为这样我就可以像在现实生活中那样显示它们。

所以目前我有这个代码......

factory(App\Models\User::class, 50)->create()->each(function ($u) {
    $u->business()->save(factory(App\Models\Business::class)->make());
});

这非常适合创建与用户相关联的业务,但我会将该类别放在哪里?我必须在这里创作吗?并说每次有10的倍数然后创建一个类别?因为该类别无论如何都与用户无关,因此我无法执行$u->categeory之类的任何操作。我必须访问商业模式。

这是商业类别的工厂......

$factory->define(App\Models\BusinessCategory::class, function (Faker $faker) {
    return [
        'friendly_name' => $faker->word,
        'slug' => ucfirst($faker->word)
    ]
});

提前致谢。

1 个答案:

答案 0 :(得分:1)

我没有测试解决方案,因此可能会进行一些微调,但试试这个并让我知道它是否有效:

// Number of users
$numberOfUsers = 50;

// Will create roughly 1 business category per 10 users
$businessCategories = factory(App\Models\BusinessCategory::class, round($numberOfUsers/10))->create();

factory(App\Models\User::class, $numberOfUsers)->create()->each(function ($u) use ($businessCategories) {
    $business = $u->business()->save(factory(App\Models\Business::class)->make());
    // Associate it with a random business category
    $business->businessCategory()->attach(
        $businessCategories->random()->id
    );
});

修改

或者你可以从另一个方向走,做这样的事情:

// Create 5 categories
factory(App\Models\BusinessCategory::class, 5)
    ->create()
    ->each(function ($bc) {
        // Create 10 users per business category
        factory(App\Models\User::class, 10)->create()->each(function ($u) use ($bc) {
            // Create a business for the user
            $u->business()
                ->save(factory(App\Models\Business::class)->create([
                    'business_category_id' => $bc->id // Associate it with the business category
                ]));
        });
    });

两种解决方案都假定Business属于BusinessCategory。而底部的一个也假定外键列为business_category_id