Исключение badmethod callexception: метод Illuminate Database Eloquent Collection ::update не существует в Laravel

#laravel

#laravel

Вопрос:

У меня есть этот контроллер обновления в 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);
  }
  

Вид

   @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
  

Когда я отправил форму, я получил эту ошибку:

Исключение badmethod callexception: метод IlluminateDatabase Eloquent Collection ::update не существует appHttpControllersLeaveLeaveTypesController.php (268): Подсветка Поддержка Коллекция-> __вызов (‘обновить’, Массив)

и он указывает здесь:

$leavetypedetail-> обновить($insert_array);

Как мне это решить?

Спасибо

Ответ №1:

 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);
}
  

Метод запроса: ->get() возвращает коллекцию, и в последней строке инструкции foreach вы вызываете update для нее метод.
Вы должны вызвать метод обновления Model для объектов или для Query объектов.

Также у вас есть один ненужный оператор foreach . Вы можете обновить несколько строк без использования цикла foreach

В этом случае вы можете использовать следующий код:

   ... // 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);
  

Ответ №2:

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

поскольку вы используете ‘get ()’ …. $leavetypedetail теперь является коллекцией, а не экземпляром построителя запросов,
и в коллекции нет метода обновления

вы можете заменить:

   $leavetypedetail->update($insert_array);
  

с:

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