Search code examples
phpmysqllaravel-9

How to use upsert() to insert/update a database table


I got Array to String conversion error each time i tried using UPSERT() to update a table in Laravel-9

What i tried:

View page:

<tr id="me"'+newid+' class="rowca"><td>'+newid+'</td>'+
    '<td>'+v.studs_id+'<input type="hidden" name="studs_id[]" style="width:100px"         value="'+v.studs_id+'"><input type="hidden" name="studcaID[]" style="width:100px"   value="'+v.studcaID+'"></td>'+
    '<td>'+v.student.surName+' '+v.student.firstName+' '+v.student.otherName+'</td>'+
    '<td><input type="number" name="ca1[]" class="entry" style="width:40px" value="'+v.ca1+'"></td>'+
    '<td><input type="number" name="ca2[]" class="entry" style="width:40px" value="'+v.ca2+'"> </td>'+
    '<td><input type="number" name="ca3[]" class="entry" style="width:40px" value="'+v.ca3+'"></td>'+
    '<td><input type="number" name="exam[]" class="entry" style="width:40px" value="'+v.exam+'"></td>'+
    '<td><input type="number" name="e_exam[]" class="entry" style="width:40px" value="'+v.e_exam+'" readonly></td>'+
    '<td><input type="text" name="total[]" class="total" style="width:50px" value="'+v.total+'" readonly></td>'+
    '<td><input type="text" name="grade[]" class="grade" style="width:40px" value="'+v.grade+'" readonly></td>'+
    '<td><input type="hidden" name="remarkID[]" class="remark" style="width:100px" value="'+v.remarkID+'" readonly ></td>'+
    '</tr>

My Controller:

public function MarksEntryUpdate(Request $request)
       {
        $data[] = [
            'ca1'=>$request->ca1,
            'ca2'=>$request->ca2,
            'ca3'=>$request->ca3,
            'exam'=>$request->exam,
            'total'=>$request->total,
            'grade'=>$request->grade,
            'remarkID'=>$request->remarkID,
        ];

        TerminalAssessment::upsert($data, ['studcaID'], ['ca1', 'ca2']);

        $notification = array(
            'message' => 'Class Assessment Successfully Updated...!',
            'alert-type' => 'success'
        );

        return redirect()->route('marks_entry.add')->with($notification);
      }

Solution

  • You need to create an array of associative arrays instead of an array of non-associative arrays

    public function MarksEntryUpdate(Request $request)
    {
        $data = [];
    
        // Loop over the values in each row and create an associative array for each row
        foreach ($request->studs_id as $key => $value) {
            $data[] = [
                'studcaID' => $request->studcaID[$key],
                'ca1' => $request->ca1[$key],
                'ca2' => $request->ca2[$key],
                'ca3' => $request->ca3[$key],
                'exam' => $request->exam[$key],
                'total' => $request->total[$key],
                'grade' => $request->grade[$key],
                'remarkID' => $request->remarkID[$key],
            ];
        }
    
        TerminalAssessment::upsert($data, ['studcaID'], ['ca1', 'ca2']);
    
        $notification = array(
            'message' => 'Class Assessment Successfully Updated...!',
            'alert-type' => 'success'
        );
    
        return redirect()->route('marks_entry.add')->with($notification);
    }