Laravel 5.6 - 如何使用垂直表创建模型工厂?

时间:2018-03-12 17:38:49

标签: php laravel laravel-5.6 laravel-testing

我正在处理由Leads组成的应用程序,每个Lead -> hasMany -> Fields。我的申请将接受infinitewhitelisted个字段。有些Leads会有很多Fields,有些会有大约5个。因此,我选择Field表是垂直的,而不是适合我水平接受的所有字段,然后遇到MySQL错误(表格太宽等)

这是我的结构:

排行榜

id
...

字段表:

id
lead_id
field_name
field_value

我为Lead模型创建了一个模型工厂,使用5自动创建Faker个随机字段。

我的应用程序接受了textsnumbersdates(等)字段。

Field Factory:

...

$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字段。

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

E.g。

最小字段

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我想象的重复数量将是一场噩梦

1 个答案:

答案 0 :(得分:2)

如果您希望每个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,因为&#34;最小字段中有2个字段&#34;为每个Lead插入的内容。