Как импортировать CSV для «обновления» существующей записи в БД, используя Laravel - PullRequest
1 голос
/ 13 января 2020

У меня есть новый вызов в Laravel. Моему клиенту нужна ситуация, при которой он может выполнить массовое обновление, загрузив CSV в БД Laravel, проверит, если «идентификатор инцидента» уже существует, он ТОЛЬКО обновит столбцы.

т.е. у меня есть таблица которые имеют как 20 столбцов. один из столбцов называется «Идентификационный номер». Если CSV был импортирован в БД, а некоторые из CSV имеют идентификатор инцидентности, совпадающий с идентификатором, уже имеющимся в БД, сценарий должен просто ОБНОВИТЬ запись в других 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.');
        }
    }

Как мне сделать так, чтобы он функционировал как ' обновить запись 'вместо "вставки" в БД?

1 Ответ

2 голосов
/ 13 января 2020

Вы можете использовать функцию laravel updateOrCreate - https://laravel.com/docs/6.x/eloquent#other -creation-методы

$item = BanData::updateOrCreate(
    ['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]
    ]
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...