Laravel |数据库播种工厂

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel |数据库播种工厂相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

factory(AppModelsUser::class, 50)->create()->each(function ($u) {
    $u->business()->save(factory(AppModelsBusiness::class)->make());
});

这对于创建与用户相关联的业务非常完美,但我会将该类别放在哪里?我必须在这里创作吗?并说每次有10的倍数然后创建一个类别?因为无论如何这个类别都与用户无关,所以我无法做任何像$u->categeory这样的事情我将不得不访问商业模式。

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

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

提前致谢。

答案

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

// Number of users
$numberOfUsers = 50;

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

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

编辑

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

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

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

以上是关于Laravel |数据库播种工厂的主要内容,如果未能解决你的问题,请参考以下文章

我可以合并一个运行 insert into 的 .sql 文件和一个在 2 列上创建虚拟数据的 Laravel 工厂播种器吗?

Laravel工厂和枢轴工作台播种

Laravel 8 Jetstream:无法使用使用工厂和播种机播种的帐户登录

如何将 null 参数从播种机传递给 Laravel 工厂?

Laravel - 播种关系

Laravel:当表有两个外键时,为具有关系的数据库表播种