Laravel 5.6 — как создать модель фабрики с вертикальной таблицей?

Я работаю над приложением, которое состоит из 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 количество дубликатов, я думаю, будет кошмаром

1

Решение

Если вы хотите каждый 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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]