Skip to content
Advertisement

Do not stop loop when query fails. LARAVEL

I am uploading a .csv file to a controller in my laravel application, and the controller loops through all the rows of the file and create new rows in my database. I works pretty well, but the problem is that if one of the rows of the CSV has a problem, the loop will be stopped and the web page will show the error with the query problem (that can be whatever was wrong in the CSV file). But what I want, is that whenever one row can’t be saved, the controller omits that row and keep working with the next ones. This is the function of my controller:

 public function submit_file(Company $company, Request $data)
        {
            $this->validate($data, [
                'csvfile' => 'required'
            ]);
            $path = $data-> csvfile ->path();
            $file = fopen($path,"r");
            $num=1;
            $errors=[];
            while(!feof($file)){
                $job = New Job();
                $line="";
                $line=fgetcsv($file, 0, ";");
                $job->city=$line[1];
                $job->id_position =intval($line[2]);            
                
                // and so on ..
    
                if(!$company->jobs()->save($job)){
                    $errors.push(array("Line # $num" => "The line # $num of the CSV file could not be uploaded“));
                }
                $num++;
            }
            return back()->withErrors($errors);
        }

I have also tried with the try catch but I’m not quite sure of how to use it correctly.

        try { 
            $company->jobs()->save($job);
        } catch(Exception $e){                   
            array_push($errors,"The line # $num of the CSV file could not be uploaded. Error: " . $e->getMessage());             
        }  

return back()->withErrors($errors);

Thanks a lot, I will totally appreciate any help.

Advertisement

Answer

Not sure if thats what you did but try this

public function submit_file(Company $company, Request $data)
    {
        $this->validate($data, [
            'csvfile' => 'required'
        ]);
        $path = $data-> csvfile ->path();
        $file = fopen($path,"r");
        $num=1;
        $errors=[];
        while(!feof($file)){

            try {
                $job = New Job();
                $line="";
                $line=fgetcsv($file, 0, ";");
                $Job->city=$line[1];
                $Job->id_position =intval($line[2]);

                // and so on ..

                if(!$company->jobs()->save($job)){
                    $errors.push(array("Line # $num" => "The line # $num of the CSV file could not be uploaded"));
                }
                $num++;
            } catch(Exception $ex) {
                $errors . push(array("Line # $num" => "The line # $num of the CSV file could not be uploaded. Error: $ex->getMessage() "));
            }
        }
        return back()->withErrors($errors);
    }

Also, if its something wrong with the file, it would not be QueryException

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement