Yii2通过excel文件更新数据加载时间长
我正在使用Yii2创建一个工具来管理团队的工作量。因此,每天我都需要使用Excel将大量数据(大于5k)导入数据库,加载时间通常需要20-30分钟。有没有办法缩短加载时间 请帮我做这个 以下是我使用的代码:Yii2通过excel文件更新数据加载时间长,yii2,yii2-basic-app,phpoffice,Yii2,Yii2 Basic App,Phpoffice,我正在使用Yii2创建一个工具来管理团队的工作量。因此,每天我都需要使用Excel将大量数据(大于5k)导入数据库,加载时间通常需要20-30分钟。有没有办法缩短加载时间 请帮我做这个 以下是我使用的代码: public function actionImportExcel() { $inputFile = 'uploads/importexcel/import.csv'; try{ $inputFileType = \PHPExcel_IOFactory::id
public function actionImportExcel()
{
$inputFile = 'uploads/importexcel/import.csv';
try{
$inputFileType = \PHPExcel_IOFactory::identify($inputFile);
$objReader = \PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFile);
}catch(Exception $e)
{
die('Error');
}
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
for( $row = 1; $row <= $highestRow; $row++)
{
$rowData = $sheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE);
if($row == 1)
{
continue;
}
$test = $rowData[0][0];
$ext = Sku3d::find()->where(['sku' => $test])->exists();
if($ext){
$one = Sku3d::find()->where(['sku' => $test])->one();
$one->status = $rowData[0][14];
$one->round = $rowData[0][19];
$one->source = $rowData[0][29];
$one->modeler = $rowData[0][30];
if($one->datesubmit == NULL || $one->datesubmit == ""){
$one->save();
}else{
$day = DateTime::createFromFormat('Y-m-d', $one->datesubmit);
$one->monthsubmit=date("Y-m-t", strtotime($one->datesubmit));
$one->save();
}
if($rowData[0][14] == "Approved"){
$one->approvedate = $rowData[0][16];
if($one->approvedate == NULL || $one->approvedate == ""){
$one->save();
}else{
$one->approvemonth=date("Y-m-t", strtotime($one->approvedate));
$one->save();
}
}else{
$one->approvedate = Null;
$one->approvemonth = Null;
}
$one->save();
// print_r($one->getErrors());
// die;
}
else{
}
}
}
公共函数actionImportExcel()
{
$inputFile='uploads/importexcel/import.csv';
试一试{
$inputFileType=\PHPExcel\u IOFactory::identify($inputFile);
$objReader=\PHPExcel\u IOFactory::createReader($inputFileType);
$objPHPExcel=$objReader->load($inputFile);
}捕获(例外$e)
{
死亡(“错误”);
}
$sheet=$objPHPExcel->getSheet(0);
$highestRow=$sheet->getHighestRow();
$highestColumn=$sheet->getHighestColumn();
对于($row=1;$row RANGETORARRAY('A'.$row'.:'.$HIGHESTCLUMN.$row,NULL,TRUE,FALSE));
如果($row==1)
{
继续;
}
$test=$rowData[0][0];
$ext=Sku3d::find()->其中(['sku'=>$test])->存在();
如果($ext){
$one=Sku3d::find()->其中(['sku'=>$test])->one();
$one->status=$rowData[0][14];
$one->round=$rowData[0][19];
$one->source=$rowData[0][29];
$one->modeler=$rowData[0][30];
如果($one->datesubmit==NULL | |$one->datesubmit==“”){
$one->save();
}否则{
$day=DateTime::createFromFormat('Y-m-d',$one->datesubmit);
$one->monthsubmit=date(“Y-m-t”,strotime($one->datesubmit));
$one->save();
}
如果($rowData[0][14]=“已批准”){
$one->approvedate=$rowData[0][16];
如果($one->approvedate==NULL | |$one->approvedate==“”){
$one->save();
}否则{
$one->approvedmonth=日期(“Y-m-t”,标准时间($one->approvedate));
$one->save();
}
}否则{
$one->approvedate=Null;
$one->approvemonth=Null;
}
$one->save();
//打印($one->getErrors());
//死亡;
}
否则{
}
}
}
谢谢!当您检查行是否已经存在以及从DB加载行时,您正在执行非常类似的查询 如果希望新记录多于现有记录,可以在周期之前将所有sku加载到阵列中,然后检查sku是否在现有记录中 在循环的
之前:
$existingSkus=Sku3d::find()
->选择(['sku'])
->indexBy(‘sku’)
->列();
然后在您的for循环中:
if (array_key_exists($test, $existingsSkus)) {
$one = Sku3d::find()->where(['sku' => $test])->one();
// ...
}
如果希望导入中的大多数行已经存在于数据库中,并且要更新它们,则可以跳过exists()
查询,直接加载数据
$one=Sku3d::find()->其中(['sku'=>$test])->one();
如果(!空($1)){
//…更新$1中加载的现有行
}否则{
//…创建新行
}
代码中的另一个问题是,您为每个更新的行多次调用save
if($one->datesubmit==NULL | |$one->datesubmit==“”){
$one->save();//第一次保存
}否则{
// ...
$one->save();//第一次保存-else分支
}
// ...
如果($rowData[0][14]=“已批准”){
$one->approvedate=$rowData[0][16];
如果($one->approvedate==NULL | |$one->approvedate==“”){
$one->save();//第二次保存
}否则{
$one->approvedmonth=日期(“Y-m-t”,标准时间($one->approvedate));
$one->save();//第二次保存-else分支
}
}否则{
$one->approvemonth=Null;
}
$one->save();//前一个条件为真时第三次保存,否则第二次保存
您真的需要在完成所有更改之前调用保存吗?在最后执行一次保存比每行执行2或3次保存更快
另外,如果在每次导入中有许多新行,您可能希望使用,而不是为每行创建和保存新模型。感谢您指出这一点。我已经知道批插入^^_^