【问题标题】:Laravel | Database seeding factory拉拉维尔 |数据库种子工厂
【发布时间】:2018-08-26 00:50:33
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 每个企业都会有一个类别吗?我假设您希望每个企业都属于一个类别,但不是每个企业都有一个新类别(因此每约 10 个企业将共享同一个类别)。我的假设正确吗?或者只有 1/10 的企业实际上有一个类别。
  • 你的假设是正确的,这正是我想要实现的。
  • 发布了一些应该让你走上正轨的东西。让我知道它是否有效。我不是 100% 确定 $u->business()->save(...) 实际上会返回商业模式。如果没有,它将无法按原样工作。

标签: php laravel eloquent migration faker


【解决方案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_category_id

【讨论】:

  • 您好,感谢您的回复。第一种方法似乎最适合我,但是我得到associate 的错误不存在。现在打算试试第二种方法。
  • 唯一的问题是,使用第二种方法。它基于创建用户和业务。但是,我还需要做商业图片等。
  • 我猜到了!使用您的第一个基础,我设法完成了这项工作!所以基本上,我有一个belongsToMany 关系,所以associate 不存在。因此,运行这条线 $business->categories()->attach($businessCategories->random()->id); 正是我所需要的!
  • 啊太棒了!有道理,->associate() 可以反过来工作。我的错。将编辑答案以纠正该问题。编辑:它实际上不会,它可以在belongsTo
  • 我会接受的。谢谢你,一开始我认为这是不可能的,现在我需要为我拥有的其余表格做这件事,但现在我有了应该不会太难的基础。
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 2021-01-17
  • 2017-03-12
  • 2021-07-12
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多