Я работаю над приложением, которое состоит из 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
(и т. д.) поля, которые принимает мое приложение.
Полевой завод:
...
$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
на вертикальном столе, используя фабрику?
Например.
Минимальные поля
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, потому что есть 2 поля из «минимальных полей», которые вставляются для каждого Lead
,
Других решений пока нет …