【问题标题】:Laravel 5.6 - how to create a model factory with a vertical table?Laravel 5.6 - 如何创建带有垂直表的模型工厂?
【发布时间】:2018-08-20 20:02:19
【问题描述】:

我正在开发由Leads 组成的应用程序,每个Lead -> hasMany -> Fields。我的应用程序将接受 infinite 数量的 whitelisted 字段。一些Leads 将有很多Fields,其他可能有5 个左右。因此,我选择了Field 表格是垂直的,而不是适合我水平接受的所有字段,并且然后遇到 MySQL 错误(表太宽等)

这是我的结构:

领导表

id
...

字段表:

id
lead_id
field_name
field_value

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

我有一个我的应用程序接受的textsnumbersdates(等)字段数组。

现场工厂:

...

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

【问题讨论】:

    标签: php laravel laravel-5.6 laravel-testing


    【解决方案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,因为每个 Lead 都会插入“最小字段”中的 2 个字段。

    【讨论】:

    • 啊 - 太棒了,我没想到!但是,我意识到一个新问题,是否有办法避免创建同一字段的重复项?
    • 重复是什么意思? Faker 应该防止 field_values 不重复,但我认为意图是 field_name 应该为每个 Lead 重复。
    • 我不希望为同一个潜在客户多次输入相同的 field_name。我已经验证以防止它在我的控制器中出现,但我正在尝试对相同的方法进行单元测试
    • 您可以为此在数据库中添加唯一约束
    • Faker 有 -&gt;unique() 方法只针对这个 github.com/fzaninotto/Faker
    猜你喜欢
    • 2018-06-09
    • 2019-06-21
    • 2017-03-21
    • 2022-11-22
    • 2020-03-09
    • 2018-09-03
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多