Laravel 5.6 - 如何创建具有垂直table 的模型工厂?

Laravel 5.6 - how to create a model factory with a vertical table?

我正在处理由 Leads、每个 Lead -> hasMany -> Fields 组成的应用程序。我的应用程序将接受 infinite 数量的 whitelisted 字段。有些 Leads 会有很多 Fields,其他人可能会有 5 个左右。因此,我选择 Field table 是垂直的,而不是适合我水平接受的所有字段,然后 运行 变成 MySQL 错误(table 太宽等)

这是我的结构:

领先Table

id
...

字段Table:

id
lead_id
field_name
field_value

我为我的 Lead 模型创建了一个模型工厂,它使用 Faker.

自动创建 5 个随机字段

我有一个我的应用程序接受的 textsnumbersdates(等)字段数组。

现场工厂:

...

$texts = config('fields.whitelist.text');
foreach ($texts as $text) {
    $fields[$text] = $faker->sentence();
}

...

$randomField = array_random(array_keys($fields));    

return [
    'field_name' => $randomField,
    'field_value' => $fields[$randomField],
];

我一直在这样做:

$lead = factory(Lead::class)->create()
         ->each(function ($l) {
             $l->fields()->save(factory(Field::class, 5)->make());
         });

但是,我现在有一个 minimum 数组 Fields 每个 Lead 都必须有。我在另一个配置中有这些 minimum 字段。

是否可以使用工厂在垂直 table 上自动创建 x 最小值 Fields

例如

最小字段数

first_name
date_of_birth

如何编写一个工厂来自动创建以下结构:

[
    'field_name' => 'first_name',
    'field_value' => '<random name>',
],
[
    'field_name' => 'date_of_birth',
    'field_value' => '<random date>',
],

编辑:如果可能,不要插入重复的 field_name 值。不像它是 100% 的交易破坏者,但我想确保我 100% 知道我正在使用什么数据,所以检查 x 我认为重复的数量将是一场噩梦

如果您希望每个 Lead 都具有这些最小字段,则将这些字段添加到您的 each() 闭包中。像这样:

$lead = factory(Lead::class)->create()->each(function ($lead) {
    $lead->fields()->createMany([
        'field_name' => 'first_name',
        'field_value' => $faker->firstName,
    ],
    [
        'field_name' => 'date_of_birth',
        'field_value' => $faker->dateTime(),
    ]);
    $lead->fields()->save(factory(Field::class, 3)->make());
});

我将 Field 工厂更改为 3,因为每个 Lead.

插入了 "minimum fields" 中的 2 个字段