CodeIgniter3导入CSV/Excel:添加SKU已存在则跳过导入规则
实现CodeIgniter3导入Excel/CSV时跳过已存在SKU的记录
1. 先拉取数据库中已有的SKU列表
在application/controllers/Home.php的import_excel函数开头,先查询数据库把所有已存在的SKU取出来,转成方便快速查找的数组。假设你的商品表是products,SKU字段为sku:
// 获取数据库中已存在的SKU $existing_skus = $this->db->select('sku')->get('products')->result_array(); // 转成一维数组,后续判断更高效 $existing_sku_list = array_column($existing_skus, 'sku'); // 数据量大的话,转成关联数组用isset判断更快(可选优化) // $existing_sku_list = array_flip($existing_sku_list);
2. 遍历导入行时添加SKU检查逻辑
在你读取Excel/CSV行数据的循环里,先取出当前行的SKU,判断是否在已存在列表里,存在就直接跳过,不存在再执行插入操作。
假设你原有的循环代码类似这样,修改后:
// 假设$sheet是PhpSpreadsheet的工作表实例 $highestRow = $sheet->getHighestRow(); // 从第2行开始(默认第1行是表头) $imported = 0; $skipped = 0; for ($row = 2; $row <= $highestRow; $row++) { $sku = trim($sheet->getCell('A' . $row)->getValue()); // 假设SKU在A列,加trim避免空格干扰 // 检查SKU是否已存在 if (in_array($sku, $existing_sku_list)) { // 如果用了关联数组优化,就改成 if (isset($existing_sku_list[$sku])) $skipped++; continue; } // 组装当前行的数据(根据你的表字段调整) $data = [ 'sku' => $sku, 'product_name' => $sheet->getCell('B' . $row)->getValue(), 'price' => $sheet->getCell('C' . $row)->getValue(), // 其他字段... ]; // 插入数据库 $this->db->insert('products', $data); $imported++; } // 可以给用户返回导入统计 $this->session->set_flashdata('msg', "导入完成:成功添加{$imported}条,跳过{$skipped}条已存在SKU的记录"); redirect('home');
注意事项
- 确保SKU字段在数据库里是唯一索引,双重避免重复数据
- 如果导入的文件很大,建议分批处理,避免内存溢出
内容的提问来源于stack exchange,提问作者Marcin Wierzycki
相关产品推荐
相关产品推荐

