这是我的两张桌子的 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,
]);
});
这一切都与批量插入和更新有关,以减少数据库网络往返调用。
截至目前,您似乎通过单独创建每一行至少进行了
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:我还没有在我的系统上测试过这个,因为我无法复制你的问题,但你可以在这里或那里修复任何小问题,但总体思路保持不变。