我正在处理由Leads
组成的应用程序,每个Lead
-> hasMany ->
Fields
。我的申请将接受infinite
个whitelisted
个字段。有些Leads
会有很多Fields
,有些会有大约5个。因此,我选择Field
表是垂直的,而不是适合我水平接受的所有字段,然后遇到MySQL错误(表格太宽等)
这是我的结构:
排行榜
id
...
字段表:
id
lead_id
field_name
field_value
我为Lead
模型创建了一个模型工厂,使用5
自动创建Faker
个随机字段。
我的应用程序接受了texts
,numbers
,dates
(等)字段。
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
我想象的重复数量将是一场噩梦
答案 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
插入的内容。