首页 > 解决方案 > Laravel 慢插入

问题描述

我在网格中有超过 8k 条记录,当我发布它们并使用如下插入代码运行循环时,插入需要超过 10 分钟,

            for($i=0; $i< count($emp_code); $i++)
            {
                $objLabor = new Labor;
                $objLabor->project_id = $project_id;
                $objLabor->emp_code = $emp_code[$i];
                $objLabor->emp_name = $emp_name[$i];
                $objLabor->emp_profession = $emp_profession[$i];
                if($salary_date[$i] != "")  $objLabor->salary_date =  date("Y-m-d H:i:s", strtotime($salary_date[$i] ));
                if($salary_period_from[$i] != "")   $objLabor->salary_period_from = date("Y-m-d H:i:s", strtotime($salary_period_from[$i]));
                if($salary_period_to[$i] != "") $objLabor->salary_period_to = date("Y-m-d H:i:s", strtotime($salary_period_to[$i]));
                $objLabor->quantity = $quantity[$i];
                $objLabor->uom = $uom_id[$i];
                if($rate[$i] != "") $objLabor->rate = AppHelper::instance()->formatCurrency($rate[$i]);
                $objLabor->basic_amount = $quantity[$i] * doubleval($objLabor->rate);
                if($allowance[$i] != "") $objLabor->allowance = AppHelper::instance()->formatCurrency($allowance[$i]);
                if($deduction[$i] != "") $objLabor->deduction = AppHelper::instance()->formatCurrency($deduction[$i]);
                if($overtime[$i] != "") $objLabor->overtime = AppHelper::instance()->formatCurrency($overtime[$i]);
                $addUp = doubleval($objLabor->basic_amount) + doubleval($objLabor->allowance) + doubleval($objLabor->overtime);
                $objLabor->net_amount = $addUp - doubleval($objLabor->deduction);
                $objLabor->budget_node_id = $budget_code[$i];
                $objLabor->remarks = $remarks[$i];
                $objLabor->budget_node_remarks = $budget_code_remarks[$i];
                $objLabor->added_by = Auth::id();
                $objLabor->added_on = date("Y-m-d H:i:s");  
                $objLabor->batch_id = $objBulkImportHistory->id;    
                $objLabor->save();
            }

但是当我让它插入查询时,它会在几秒钟内执行

for($i=0; $i< count($emp_code); $i++)
{
DB::query('insert into labor (project_id, emp_code, emp_name,emp_profession,added_by,batch_id,added_on) 
                values (' . $project_id . ', ' . $emp_code[$i] . ',' .  $emp_name[$i]. ',' .  $emp_profession[$i]
                . ',' .  $user_id . ',' .  $bulk_id .   ',' . date("Y-m-d H:i:s") .')');
}

这是我的模型

namespace a2zcost;

use Illuminate\Database\Eloquent\Model;

class Labor extends Model
{
    protected $table = 'labor';
    public $timestamps = false;

}

可能是什么问题?我错过了什么或做得不对?

标签: laravelperformanceeloquent

解决方案


您需要进行大量插入

$insertAbleObjLabors = [];
for($i=0; $i< count($emp_code); $i++)
{
    $objLabor = new Labor;
    $objLabor->project_id = $project_id;
    $objLabor->emp_code = $emp_code[$i];
    $objLabor->emp_name = $emp_name[$i];
    $objLabor->emp_profession = $emp_profession[$i];
    if($salary_date[$i] != "")  $objLabor->salary_date =  date("Y-m-d H:i:s", strtotime($salary_date[$i] ));
    if($salary_period_from[$i] != "")   $objLabor->salary_period_from = date("Y-m-d H:i:s", strtotime($salary_period_from[$i]));
    if($salary_period_to[$i] != "") $objLabor->salary_period_to = date("Y-m-d H:i:s", strtotime($salary_period_to[$i]));
    $objLabor->quantity = $quantity[$i];
    $objLabor->uom = $uom_id[$i];
    if($rate[$i] != "") $objLabor->rate = AppHelper::instance()->formatCurrency($rate[$i]);
    $objLabor->basic_amount = $quantity[$i] * doubleval($objLabor->rate);
    if($allowance[$i] != "") $objLabor->allowance = AppHelper::instance()->formatCurrency($allowance[$i]);
    if($deduction[$i] != "") $objLabor->deduction = AppHelper::instance()->formatCurrency($deduction[$i]);
    if($overtime[$i] != "") $objLabor->overtime = AppHelper::instance()->formatCurrency($overtime[$i]);
    $addUp = doubleval($objLabor->basic_amount) + doubleval($objLabor->allowance) + doubleval($objLabor->overtime);
    $objLabor->net_amount = $addUp - doubleval($objLabor->deduction);
    $objLabor->budget_node_id = $budget_code[$i];
    $objLabor->remarks = $remarks[$i];
    $objLabor->budget_node_remarks = $budget_code_remarks[$i];
    $objLabor->added_by = Auth::id();
    $objLabor->added_on = date("Y-m-d H:i:s");
    $objLabor->batch_id = $objBulkImportHistory->id;
    $insertAbleObjLabors[] = $objLabor->toArray();
}

Labor::insert($insertAbleObjLabors);

推荐阅读