0
votes

I have this update controller in Laravel-5.8

  $leavetype = HrLeaveType::findOrFail($id);
  $leavetype->leave_type_name             = $request->leave_type_name;
  $leavetype->leave_type_code             = $request->leave_type_code;
  $leavetype->description                 = $request->description;
  $leavetype->company_id                  = Auth::user()->company_id;
  $leavetype->created_by                  = Auth::user()->id;
  $leavetype->created_at                  = date("Y-m-d H:i:s");
  $leavetype->is_active                   = 1; 
  
  $leavetype->save();                         

  $employeetypes = HrLeaveTypeDetail::where('leave_type_id', $id)->get();

  foreach ($employeetypes as $key => $employeetypes){
    $leavetypedetail = HrLeaveTypeDetail::where('leave_type_id', $id)->get();

    $insert_array = [
        'no_of_days'                        => $request->no_of_days[$key],
        'employee_type_id'                  => $request->employee_type_id[$key],     //$request->employee_type_id[$key],    
        'weekend_inclusive'                 => isset($request["weekend_inclusive$key"]) ? 1: 0,
        'leave_type_id'                     => $leavetype->id,
    ];                

    $leavetypedetail->update($insert_array);
  }

view

  @foreach($leavetypedetails as $key => $leavetypedetail)
     <tr>
       <td width="5%">
            {{$key+1}}
       </td>                             
       <td width="30%">  
            <span>{{$leavetypedetail->employeetype->employee_type_name}}</span> 
       </td>
       <td style="display: none">  
          <input type="hidden" name="employee_type_id[]" value="{{$leavetypedetail->employeetype->employee_type_name}}" class="form-control employee_type_id">
       </td>                                
       <td width="20%"><input type="number" name="no_of_days[]" value="{{$leavetypedetail->no_of_days}}" placeholder="Enter leave days here" class="form-control no_of_days" max="120">
       </td>                                                               
       <td width="10%"><input type="checkbox" name="weekend_inclusive{{$key}}"  class="form-control" data-bootstrap-switch data-off-color="danger" data-on-color="success" data-off-text="NO" data-on-text="YES" value="1" {{  ($leavetypedetail->weekend_inclusive == 1 ? ' checked' : '') }}></td>                         
     </tr>
  @endforeach

When I submitted the form, I got this error:

BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::update does not exist app\Http\Controllers\Leave\LeaveTypesController.php(268): Illuminate\Support\Collection->__call('update', Array)

and it points here:

$leavetypedetail->update($insert_array);

How do I resolve it?

Thanks

2

2 Answers

0
votes
  $leavetypedetail = HrLeaveTypeDetail::where('leave_type_id', $id)->get();

since you are using 'get()' .... $leavetypedetail is now a collection, not an instance of query builder, and the collection does not have an update method

you can replace:

  $leavetypedetail->update($insert_array);

with:

 HrLeaveTypeDetail::where('leave_type_id', $id)->->update($insert_array);
0
votes
foreach ($employeetypes as $key => $employeetypes){
  $leavetypedetail = HrLeaveTypeDetail::where('leave_type_id', $id)->get();

  $insert_array = [
      'no_of_days'                        => $request->no_of_days[$key],
      'employee_type_id'                  => $request->employee_type_id[$key],     //$request->employee_type_id[$key],    
      'weekend_inclusive'                 => isset($request["weekend_inclusive$key"]) ? 1: 0,
      'leave_type_id'                     => $leavetype->id,
  ];                

  $leavetypedetail->update($insert_array);
}

Query method: ->get() returns Collection and on last line of foreach statement you are calling update method on it. You have to call update method on Model or on Query objects.

Also you have one unnecessary foreach statement. You can update multiple rows without using foreach loop

In this case you can use following code:

  ... // other code here
  $leavetype->save();                         
  // after this line delete foreach and place only this code:

  $insert_array = [
    'no_of_days'                        => $request->no_of_days[$key],
    'employee_type_id'                  => $request->employee_type_id[$key],     //$request->employee_type_id[$key],    
    'weekend_inclusive'                 => isset($request["weekend_inclusive$key"]) ? 1: 0,
    'leave_type_id'                     => $leavetype->id,
  ];

  $employeetypes = HrLeaveTypeDetail::where('leave_type_id', $id)->update($insert_array);