Search code examples
excellaravel-5.8maatwebsite-excel

Import excel data given in each repeated 5 rows to one row in database. Laravel 5.8


I've an excel file with following data. The below is the data of 2 users. Each user have 5 rows of details. I need to import the following to 2 rows in database.

excel

The below is my table structure

Database table structure

What I need is, I need to import the excel in such a way, in the table there should be only 2 rows like below.

Resut

How can I do this in Laravel 5.8. Here is my controller code

public function importMovementFile (Request $request){

    $this->validate($request, [
           'mcafile'  => 'required|mimes:xls,xlsx,ods'
          ]);

    $path = $request->file('mcafile')->getRealPath();

    $data = \Excel::import(new UsersImport,$path);

    return back()->with('success', 'Excel Data Imported successfully.');

}

UserImports

  use Maatwebsite\Excel\Row;
  use Maatwebsite\Excel\Concerns\OnEachRow;

  class UsersImport implements OnEachRow
   {
    public function onRow(Row $row)
    {
    $rowIndex = $row->getIndex();
    $row      = $row->toArray();

   UploadMovAnalysisDataFiles::create([
        'member_name' => $row[0][$rowIndex],
    ]);
   }
 }

Solution

  • Okay I found the solution to this, We can do this by checking the name inside a for loop. First of all, check whether the name is empty or not, if empty place the first name in name variable and loop throughout. Store each scores of the corresponding name in an object. When another name comes insert the first details and loop through the next and so on.

        public function insertExcel
        {
        $obj= new UploadMovAnalysisDataFiles();
        $name ='';
        for($i=1;$i<$rows->count();$i++){
    
            if($name==''){
                $name = $rows[$i][0];
                $id = $rows[$i][1];   
                $date = date('Y-m-d h:i:s', strtotime($rows[$i][2])); 
                $visit_date = $date;
                //function call
                score($rows[$i][3],$rows[$i][4];
    
    
        }elseif($name==$rows[$i][0]){
                //function call
                score($rows[$i][3],$rows[$i][4];
    
        }else{
    
            UploadMovAnalysisDataFiles::create([
            'member_name' => $name,
            'mov_analysis_tag_id' => $id ,
            'visit_date' => $date,
            'fitness_score' => $obj->fscore,
            'knee_score' => $obj->kscore,
            'hip_score' => $obj->hscore,
            'core_score' => $obj->cscore,
            'shoulder_score' => $obj->sscore,
    
    
        ]);
            $name = $rows[$i][0];
            $id = $rows[$i][1];   
            $date = date('Y-m-d h:i:s', strtotime($rows[$i][2])); 
            $visit_date = $date;
            //function call
            score($rows[$i][3],$rows[$i][4]);
        }
        }
    
    
    
       UploadMovAnalysisDataFiles::create([
            'member_name' => $name,
            'mov_analysis_tag_id' => $id ,
           'visit_date' => $date,
            'fitness_score' => $obj->fscore,
            'knee_score' => $obj->kscore,
            'hip_score' => $obj->hscore,
            'core_score' => $obj->cscore,
            'shoulder_score' => $obj->sscore,
    
    
        ]);
    
       }
    

    Function to keep each score in an object.

         function score($rows[$i][3],$rows[$i][4){
               if($rows[$i][3]== 'VSFitness_Score'){
                   $obj->fscore =  $rows[$i][4];
               }if($rows[$i][3]== 'knee_Score'){
                   $obj->kscore =  $rows[$i][4];
               }if($rows[$i][3]== 'Hip_Score'){
                   $obj->hscore =  $rows[$i][4];
               }if($rows[$i][3]== 'Core_Score'){
                   $obj->cscore =  $rows[$i][4];
               }if($rows[$i][3]== 'Shoulder_Score'){
                   $obj->sscore =  $rows[$i][4];
               }
          }