【发布时间】:2020-04-30 03:42:35
【问题描述】:
我在 Laravel 遇到了新的挑战。 我的客户想要这样一种情况,他们可以通过将 CSV 上传到 DB 来进行大规模更新 Laravel 将交叉检查“事件 ID”是否已经存在,它只会更新列。
即我有一个大约有 20 列的表。其中一列名为“Incidence ID”。如果 CSV 已导入数据库,并且某些 CSV 的事件 ID 与数据库中已有的 ID 相同,则脚本应该只更新其他 19 列中的记录。 我已经搜索了两天多,但还没有找到任何解决方案。
这是我的控制器脚本,只能将 CSV 插入数据库
public function uploadFile(Request $request){
if ($request->input('submit') != null ){
$file = $request->file('file');
// File Details
$filename = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
$tempPath = $file->getRealPath();
$fileSize = $file->getSize();
$mimeType = $file->getMimeType();
// Valid File Extensions
$valid_extension = array("csv");
// 2MB in Bytes
$maxFileSize = 2097152;
// Check file extension
if(in_array(strtolower($extension),$valid_extension)){
// Check file size
if($fileSize <= $maxFileSize){
// File upload location
//// $location = 'uploads';
// File upload location
$location = '../uploads';
// Upload file
$file->move($location,$filename);
// Import CSV to Database
$filepath = public_path($filename);
// Reading file
$file = fopen($filepath,"r");
$importData_arr = array();
$i = 0;
while (($filedata = fgetcsv($file, 1000, ",")) !== FALSE) {
$num = count($filedata );
// Skip first row (Remove below comment if you want to skip the first row)
/*if($i == 0){
$i++;
continue;
}*/
for ($c=0; $c < $num; $c++) {
$importData_arr[$i][] = $filedata [$c];
}
$i++;
}
fclose($file);
// Insert to MySQL database
foreach($importData_arr as $importData){
$insertData = array(
"incidence_id"=>$importData[1],
"serial_no"=>$importData[2],
"name"=>$importData[3],
"activation_date"=>$importData[4],
"sol_id"=>$importData[5],
"address"=>$importData[6],
"brand"=>$importData[7],
"model"=>$importData[8],
"state"=>$importData[9],
"region"=>$importData[10],
"vendor_name"=>$importData[11],
"vendor_id"=>$importData[12],
"custodian_email"=>$importData[13],
"custodian_phone"=>$importData[14],
"asset_tag_no"=>$importData[15],
"atm_code"=>$importData[16],
"sla_level"=>$importData[17],
"sla_hour"=>$importData[18],
"timers"=>$importData[19],
"status"=>$importData[20],
"warranty"=>$importData[21]);
// "user_id"=>$importData[11]);
BanData::insertData($insertData);
}
Session::flash('message','Import Successful.');
}else{
Session::flash('message','File too large. File must be less than 2MB.');
}
}else{
Session::flash('message','Invalid File Extension.');
}
}
我怎样才能让它像“更新记录”而不是“插入”到数据库一样运行?
【问题讨论】:
标签: php mysql laravel csv eloquent