Dlatego drukuję skargi użytkowników w tabeli, w której w każdym wierszu drukuję również przycisk Usuń. Kiedy klikam ten przycisk usuwania, chcę usunąć tę konkretną skargę z tabeli. Nie używam do tego kontrolera zasobów, ale kontrolera podstawowego. A teraz mój kod:

ViewComplaint.blade.php (Tabela skarg z przyciskiem Usuń):

<table id="cTable" class="table table-striped table-bordered">
   <thead>
      <tr>
         <th>Student Name</th>
         <th>Complaint Title</th>
         <th>Complaint Description</th>
         <th>Action</th>
      </tr>
   </thead>
   <tbody>
      @foreach($complaints as $complaint)
      <tr>
         <td>{{ $complaint->name }}</td>
         <td>{{ $complaint->cname }}</td>
         <td>{{ $complaint->cbody }}</td>
         <td class="btn-group">
            {!! Form::open(array('route'=>['complaint.destroy',$complaint->id],'method'=>'DELETE')) !!}
            {!! Form::submit('Delete',['type'=>'submit','style'=>'border-radius: 0px;','class'=>'btn btn-danger btn-sm',$complaint->id]) !!}
            {!! Form::close() !!}
         </td>
      </tr>
      @endforeach
   </tbody>
</table>

Web.php (Trasy):

Route::get('/complaint/create','ComplaintController@create')->name('complaint.create');
Route::post('/complaint','ComplaintController@store')->name('complaint.store');
Route::get('/complaint','ComplaintController@index')->name('complaint.index');
Route::delete('/complaint/{$complaint->id}','ComplaintController@destroy')->name('complaint.destroy');

ComplaintController.php (kontroler podstawowy):

class ComplaintController extends Controller
{
    public function index() {
        $complaints = Complaint::all();
        return view('viewcomplaint',compact('complaints'));
    }

    public function create(User $user) {
        $user = User::all();
        $user->name = Auth::user()->name;
        return view('createcomplaint',compact('user'));
    }

    public function store(Request $request, Complaint $complaint, User $user) {
        $user =  User::find($user);
        $complaint->name = Auth::user()->name;
        $complaint->cname = $request->input('cname');
        $complaint->cbody = $request->input('cbody');

        //update whichever fields you need to be updated
        $complaint->save();
        return redirect()->route('home.index');
    }

    public function destroy(Complaint $complaint,$id)
    {
        $complaint = Complaint::findOrFail($complaint->id);
        $complaint->delete();
        return redirect()->route('complaint.index');
    }
}

Teraz, kiedy klikam przycisk Usuń na stole, pojawia się po prostu błąd „404 | Nie znaleziono”. Co ja tu robię źle? Naprawdę byłbym wdzięczny za pomoc.

2
VenoM 20 listopad 2019, 12:58
Czy możesz spróbować usunąć argument $ id z funkcji destru () i być może ponowić próbę?
 – 
Deb
20 listopad 2019, 13:03
Próbowałem, ten sam błąd
 – 
VenoM
20 listopad 2019, 13:05
Jakiej wersji Laravel używasz?
 – 
lagbox
20 listopad 2019, 13:52

3 odpowiedzi

Usuń $ id z trasy

Route::delete('/complain/{id}','ComplaintController@destroy')->name('complaint.destroy');

public function destroy($id) {

}
0
Rp9 20 listopad 2019, 13:05
Kiedy używam $id zamiast $complaint->id, jest napisane „Niezdefiniowana zmienna”.
 – 
VenoM
20 listopad 2019, 13:12

Parametr trasy to tylko nazwa; mówisz, że ten konkretny segment trasy jest dynamiczny i chcę mieć parametr o nazwie complaint:

Route::delete('complaint/{complaint}', 'ComplaintController@destroy')->name('complaint.destroy');

Następnie możesz dostosować metodę destroy tak, aby przyjmowała parametr complaint ze wskazówkami o typie jako Complaint $complaint, aby uzyskać niejawne powiązanie:

public function destroy(Complaint $complaint)
{
    $complaint->delete();

    return redirect()->route('complaint.index');
}
0
lagbox 20 listopad 2019, 13:29
Co mam podać w przycisku? Ponieważ jeśli nadal przekazuję skargę->id, adres URL zmienia się w „/complaint/{reklamacja->id}” i mówi „Nie znaleziono”.
 – 
VenoM
20 listopad 2019, 13:23
Nie przekazujesz niczego w przycisku, formularz jest tym, co definiuje url akcji
 – 
lagbox
20 listopad 2019, 13:27
Nadal wyświetla błąd 404 po kliknięciu usuń.. To jest mój formularz: {!! Form::open(array('route'=>['complaint.destroy',$complaint],'method'=>'DELETE')) !!} {!! Form::submit('Delete',['type'=>'submit','style'=>'border-radius: 0px;','class'=>'btn btn-danger btn-sm']) !!} {!! Form::close() !!}, a to jest mój kontroler: public function destroy(Complaint $complaint) { $complaint->delete(); return redirect()->route('complaint.index'); }
 – 
VenoM
20 listopad 2019, 13:31
A co się dzieje po dotarciu do tej strony 404? klikasz z powrotem w swojej przeglądarce?
 – 
lagbox
20 listopad 2019, 13:34
Wracam do adresu URL /reklamacja, przeładuję i ponownie klikam Usuń.
 – 
VenoM
20 listopad 2019, 13:35

Wydaje mi się, że źle określasz trasę. Zmień trasę na:

Route::delete('/complaint/{id}','ComplaintController@destroy')->name('complaint.destroy');

Nie potrzebujesz tablicy () w otwieraniu formularza, więc zmień otwarcie formularza na to:

{!! Form::open(['method' => 'DELETE', 'route' => ['complaint.destroy',$complaint->id]]) !!}

I usuń $complaint->id z przycisku przesyłania, nie potrzebujesz go tam.

Wszystko, co musisz teraz zrobić w swojej funkcji, to znaleźć Complaint, który ma id przekazany w formularzu:

public function destroy($id)
    {
        $complaint = Complaint::findOrFail($id);
        $complaint->delete();
        return redirect()->route('complaint.index');
    }

Daj mi znać, jeśli napotkasz jakieś błędy.

0
zlatan 20 listopad 2019, 13:59
array(1, 2, 3) to to samo co [1, 2, 3]
 – 
lagbox
20 listopad 2019, 13:55
Tak, jest po prostu łatwiejszy do odczytania, więc nie ma potrzeby określania metody array()
 – 
zlatan
20 listopad 2019, 13:56
Ułatwia zapomnienie o umieszczeniu zamykającego ] na tablicy w twoim przykładzie ;)
 – 
lagbox
20 listopad 2019, 13:58