Laravel |数据库播种工厂

问题描述 投票:0回答:1

我目前正在了解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)
    ]
});

提前致谢。

php laravel eloquent migration faker
1个回答
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为外键列。

© www.soinside.com 2019 - 2024. All rights reserved.