优化 Laravel 数据库播种器

问题描述 投票:0回答:1

这是我的两张桌子的 Laravel 种子。我需要一种针对该播种机的高效且优化的方法。如何才能做到高效、规范。给我一些建议。

$userId = User::first()->id;

        // information of email template variable
        $emailTemplateVariables = [
            'user-create' => ['module' => 1, 'module_event' => 1, 'value' => ['USER_NAME', 'USER_EMAIL']],
            'user-deactive' => ['module' => 1, 'module_event' => 7, 'value' => ['USER_NAME', 'USER_EMAIL']],
            'purchase-order-create' => ['module' => 5, 'module_event' => 1, 'value' => ['ORDER_NO', 'PRODUCT_NAME', 'PURCHASE_DATE', 'PRODUCT_QUANTITY', 'ORDER_PRICE', 'SUPPLIER', 'SUPPLIER_INVOICE_NO', 'WAREHOUSE', 'STORE_NAME', 'STORE_ADDRESS', 'STORE_PHONE', 'STORE_WEBSITE', 'STORE_EMAIL']]
        ];

        collect($emailTemplateVariables)->each(function ($templateVariableItem, $slug) use ($userId) {
            $templateVariableIds = collect($templateVariableItem['value'])
                ->map(function ($value) use ($userId) {
                    return EmailTemplateVariable::updateOrCreate(
                        ['variable_key' => $value],
                        ['created_by' => $userId]
                    )->id;
                })->toArray();

            EmailTemplateSetting::create([
                'slug' => $slug,
                'module_id' => $templateVariableItem['module'],
                'module_event_id' => $templateVariableItem['module_event'],
                'template_variable_ids' => json_encode($templateVariableIds),
                'created_by' => $userId,
            ]);
        });
php laravel seed laravel-seeding
1个回答
0
投票

这一切都与批量插入和更新有关,以减少数据库网络往返调用。

截至目前,您似乎通过单独创建每一行至少进行了

19-21
数据库调用。在 Eloquent 模型上使用
upsert
insert
将数据库调用减少为仅
3
调用。

upsert
所有值而不是
updateOrCreate

insert
如批量插入
EmailTemplateSetting

<?php

$userId = User::first()->id;

$templateSettings = [];

// information of email template variable
$emailTemplateVariables = [
    'user-create' => ['module' => 1, 'module_event' => 1, 'value' => ['USER_NAME', 'USER_EMAIL']],
    'user-deactive' => ['module' => 1, 'module_event' => 7, 'value' => ['USER_NAME', 'USER_EMAIL']],
    'purchase-order-create' => ['module' => 5, 'module_event' => 1, 'value' => ['ORDER_NO', 'PRODUCT_NAME', 'PURCHASE_DATE', 'PRODUCT_QUANTITY', 'ORDER_PRICE', 'SUPPLIER', 'SUPPLIER_INVOICE_NO' , 'WAREHOUSE', 'STORE_NAME', 'STORE_ADDRESS', 'STORE_PHONE', 'STORE_WEBSITE', 'STORE_EMAIL']]
];

$rows = [];
$values = [];

foreach($emailTemplateVariables as $templ){
    foreach($templ['value'] as $v){
        $values[] = $v;
        $rows[] = ['variable_key' => $v, 'created_by' => $userId];
    }
}

EmailTemplateVariable::upsert($rows, ['variable_key', 'created_by']);

$variableMap = EmailTemplateVariable::select('id', 'variable_key')
                ->whereIn('variable_key', $values)
                ->where('created_by', $userId)
                ->get()->toArray();

$variableMap = array_column($variableMap, 'id', 'variable_key');

$rows = [];

foreach($emailTemplateVariables as $slug => $templ){
    $variableIds = [];
    foreach($templs['value'] as $v){
        $variableIds[] = $variableMap[ $v ];
    }
    $rows[] = [
        'slug' => $slug,
        'module_id' => $templ['module'],
        'module_event_id' => $templ['module_event'],
        'template_variable_ids' => json_encode($variableIds),// should rather be a one-to-many-relationship form to follow 1st NF
        'created_by' => $userId,
    ];
}

EmailTemplateSetting::insert($rows);

P.S:我还没有在我的系统上测试过这个,因为我无法复制你的问题,但你可以在这里或那里修复任何小问题,但总体思路保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.