Вызов функции-члена forceDelete() с нулевым значением, хотя dd($id) возвращает 19 laravel

#laravel #laravel-8

Вопрос:

Я хочу forceDelete опубликовать архивный счет-фактуру, но он выдает ошибку:

Вызов функции-члена forceDelete() при нулевом значении

Когда я пишу код в названном методе контроллера destroyarchieve() , я пишу это return $request; .

Это говорит мне id request о том, и о том, и вот оно, и я хочу знать, почему оно не вернуло мне id то, и это говорит мне только invoice id :

 {
    "_token": "NkNlrJx1y5vrsPYnrTGuoTL3iBlomJp6NOl9SOQw",
    "_method": "DELETE",
    "invoice_id": "16"
}
 

Когда я dd($id) его верну 19 . Затем, когда я запускаю этот код:

 public function destroyarchieve(Request $request, $id) {
    // dd($id);
    // return $request;
    
    $i = invoices::find($id);
    $i->forceDelete();

    return back();
}
 

Это приводит к ошибке.

Вот моя form страница с кнопочным лезвием:

 <form action="{{ route('in.destroyarchieve', $i->id) }}" method="POST">
    @method('DELETE')
    @csrf
    <input type="hidden" value="{{ $i->id }}" name="invoice_id">
    <button type="submit">delete</button>
</form>
 

И мой маршрут web.php :

 Route::delete('inarchieve/{id}', [AppHttpControllersInvoicesController::class, 'destroyarchieve'])
    ->name('in.destroyarchieve');
 

И мой контроллер:

 public function destroyarchieve(Request $request, $id) {
    // dd($id);
    // return $request;
    
    $i = invoices::find($id);
    $i->forceDelete();

    return back();
}
 

Ответ №1:

Не отправляйте тело в действии удаления, удалите:

 <input type="hidden" value="{{ $i->id }}" name="invoice_id">
 

Вы можете отправлять id только по URL-адресу, и вы можете сделать вот так:

 public function destroyarchieve($id) {
    $i = invoices::findOrFail($id);
    $i->forceDelete();

    return back();
}
 

Убедитесь id , что действие, отправленное в форме, является правильным:

 {{ route('in.destroyarchieve', $i->id) }}
 

Комментарии:

1. Он также может воспользоваться неявной привязкой , поэтому ему не нужно писать $i = invoices::findOrFail($id); , так как он уже сделает это за вас.

2. да , привязка модели-хорошая функция , он может это сделать : публичная функция destroyarchieve(Счет-фактура $счет-фактура) {} в маршруте : Маршрут::удалить («inarchieve/{счет-фактура}», [ПриложениеHttpКонтроллерыInvoicesController::класс, «destroyarchieve»]) — >имя(«in.destroyarchieve»);