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
个随机字段
我有一个我的应用程序接受的 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
字段。
是否可以使用工厂在垂直 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 个字段
我正在处理由 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
个随机字段
我有一个我的应用程序接受的 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
字段。
是否可以使用工厂在垂直 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
.