My situation is very difficult. I'm building a birth list clone using scraper, but I'm having a hard time coding it because I'm inexperienced. I successfully created an admin page with multiple forms for inserting sites, categories and link forms where you can specify on which link should be crawled and to which site and category it will be linked. However, adding something like this is okay, but deleting it is not..
My sites, categories, and links are displayed on my admin page, with a grab and delete button for each element. When I delete the last item in the row, it deletes the first element. When I want to delete something else, laravel throws an exception and it tries to read the property on null which means it doesn't exist anymore. When I dump before removing the function and die, every item in every list has the id "1". That's why it deletes the first item in a row. Can anyone help me?
I think this is because the id requesting to delete the item is retrieved from the url and the id given in the url is the user id which is 1. So if anyone can give me a hint to make sure I can give the user's ID in a different way. let me know! My code:
Management Controller:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Website; use App\Models\Category; use App\Models\Link; use Goutte\Client; class AdminController extends Controller { public function showAdmin($id) { $categories = Category::all(); $websites = Website::all(); $links = Link::all(); return view('admin', compact('categories', 'websites', 'links')); } public function storeWeb(Request $request) { $web = Website::create([ 'title' => $request->input('site'), 'url' => $request->input('url') ]); return back(); } public function destroyWeb(Request $request, $id) { $web = Website::find($id); $web->delete(); return back(); } public function storeCat(Request $request) { $cat = Category::create([ 'title' => $request->input('title') ]); return back(); } public function destroyCat(Request $request, $id) { $cat = Category::find($id)->first(); $cat->delete(); return back(); } public function storeLink(Request $request) { $link = Link::create([ 'url' => $request->input('scrapeUrl'), 'main_filter_selector' => $request->input('filter'), 'website_id' => $request->input('website_id'), 'category_id' => $request->input('category_id'), ]); return back(); } public function destroyLink(Request $request, $id) { $link = Link::find($id); dd($link); $link->delete(); return back(); } public function scrape(Request $request) { $link = Link::find($request->link_id); $scraper = new Scraper (new Client()); $scraper->handle($link); if($scraper->status == 1) { return response()->json(['status' => 1, 'msg' => 'Scraping done']); } else { return response()->json(['status' => 2, 'msg' => $scraper->status]); }; } }
My management page:
<body class="relative min-h-screen"> @include('partials.header') <main class="pb-20"> <div class="text-center m-auto text-2xl p-4 w-fit border-b"> <h2>Welkom <strong>{{ auth()->user()->name }}</strong></h2> </div> <div class="gap-10 m-auto xl:w-3/5"> <div class="mt-8"> <h3 class="bg-gray-100 p-4"><strong>Winkels</strong></h3> <div class=""> <div class="p-4 m-auto"> <form action="{{ route('newWeb', Auth()->user()) }}" method="POST"> @csrf <div class="flex wrap flex-row items-center justify-left my-4"> <label for="shop" class="w-2/12">Webshop:</label> <input type="text" required class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100" name="site" id="titel" placeholder="Dreambaby"> </div> <div class="flex wrap flex-row items-center justify-left"> <label for="url" class="w-2/12"> Voeg een url toe: </label> <input type="url" required class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100" name="url" id="url" placeholder="http://dreambaby.com/"> <button class="w-fit bg-green-400 h-fit p-2 rounded hover:bg-green-600 hover:text-white mx-2" name="shop" value="add" type="submit">Voeg link toe</button> </div> </form> <div class="flex wrap flex-row items-center mt-12"> <div class="flex flex-row flex-wrap w-full"> <table class="table-auto"> @foreach ($websites as $web) <form action="{{ route('delWeb', Auth()->user()) }}" method="POST"> @csrf @method('DELETE') <tr class="border-b"> <td class="p-4">{{ $web->title }}</td> <td class="p-4">{{ $web->id }}</td> <td class="p-4"><button class="w-fit h-full p-2 bg-red-400 h-fit rounded hover:bg-red-600 hover:text-white block m-auto" type="submit">Verwijderen</button> </td> </tr> </form> @endforeach </table> </div> </div> </div> </div> </div> </div> <div class="gap-10 m-auto xl:w-3/5"> <div class="mt-8"> <h3 class="bg-gray-100 p-4"><strong>Categorieën</strong></h3> <div class="mt-4"> <div class="p-4 m-auto"> <form action="{{ route('newCat', Auth()->user()) }}" method="POST"> @csrf <div class="flex wrap flex-row items-center justify-left"> <label for="url" class="w-2/12"> Voeg een categorie toe: </label> <input type="text" required class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100" name="title" id="cat" placeholder="Eten en Drinken"> <button class="w-fit bg-green-400 h-fit p-2 rounded hover:bg-green-600 hover:text-white mx-2" name="category_submit" type="submit">toevoegen</button> </div> </form> <div class="flex wrap flex-row items-center mt-12"> <div class="flex flex-row flex-wrap w-full"> <table class="table-auto"> @foreach ($categories as $category) <form action="{{ route('delCat', Auth()->user()), $category->id }}" id="{{ $category->id }}" method="POST"> @csrf @method('DELETE') <tr class="border-b"> <td class="p-4">{{ $category->title }}</td> <td class="p-4">{{ $category->id }}</td> <td class="p-4"><button class="w-fit h-full p-2 bg-red-400 h-fit rounded hover:bg-red-600 hover:text-white block m-auto" type="submit">Verwijderen</button> </td> </tr> </form> @endforeach </table> </div> </div> </div> </div> </div> </div> <div class="gap-10 m-auto xl:w-3/5"> <div class="mt-8"> <h3 class="bg-gray-100 p-4"><strong>Scrapes</strong></h3> <div class=""> <div class="p-4 m-auto"> <form action="{{ route('newLink', Auth()->user()) }}" method="POST"> @csrf <div class="flex wrap flex-row items-center justify-left my-4"> <label for="scrape" class="w-2/12">Url:</label> <input type="text" required class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100" name="scrapeUrl" id="scrapetitel" placeholder="https://www.thebabyscorner.be/nl-be/baby_eten_en_drinken/"> </div> <div class="flex wrap flex-row items-center justify-left my-4"> <label for="text" class="w-2/12"> Filter: </label> <input type="text" required class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100" name="filter" id="url" placeholder=".1-products-item"> </div> <div class="flex wrap flex-row items-center justify-left my-4"> <label for="webpicker" class="w-2/12">Winkel:</label> <select name="website_id" id="" class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100"> <option value="#" disabled selected>Kies je winkel</option> @foreach ($websites as $web) <option value="{{ $web->id }}" >{{ $web->title }}</option> @endforeach </select> </div> <div class="flex wrap flex-row items-center justify-left my-4"> <label for="webpicker" class="w-2/12">Categorie:</label> <select name="category_id" id="" class="w-7/12 h-fit p-2 focus:outline-sky-500 rounded bg-slate-100"> <option value="#" disabled selected>Kies je categorie</option> @foreach ($categories as $cat) <option value="{{ $cat->id }}" >{{ $cat->title }}</option> @endforeach </select> <button class="w-fit bg-green-400 h-fit p-2 rounded hover:bg-green-600 hover:text-white mx-2" type="submit" name="scrape_submit">toevoegen</button> </div> </form> <div class="flex wrap flex-row items-center mt-12 w-full"> <div class="flex flex-row flex-wrap w-full"> <form action="{{ route('delLink', Auth()->user()) }}" method="POST"> @csrf @method('DELETE') <table class="table-auto w-full"> <tr class="bg-slate-300"> <td class="p-4"><strong>Url</strong></td> <td class="p-4"><strong>Filter selector</strong></td> <td class="p-4"><strong>Website</strong></td> <td class="p-4"><strong>Categorie</strong></td> <td></td> <td></td> </tr> @foreach ($links as $link) <tr data-id="{{ $link->id }}" class=""> <td class="p-4 border-r">{{ $link->url }}</td> <td class="p-4 border-r">{{ $link->main_filter_selector }}</td> <td class="p-4 border-r">{{ $link->website->title }}</td> <td class="p-4 border-r">{{ $link->category->title }}</td> <td class="p-4 border-r"><button class="w-fit bg-green-400 h-fit p-2 rounded hover:bg-green-600 hover:text-white block m-auto" type="submit">Scrape</button></td> <td class="p-4"><button class="w-fit h-full p-2 bg-red-400 h-fit rounded hover:bg-red-600 hover:text-white block m-auto" type="submit">Verwijderen</button> </td> </tr> @endforeach </table> </form> </div> </div> </div> </div> </div> </main> @include('partials.footer') </body>
My route:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\HomeController; use App\Http\Controllers\DashController; use App\Http\Controllers\ListviewController; use App\Http\Controllers\NewlistController; use App\Http\Controllers\BabyController; use App\Http\Controllers\ScrapeController; use App\Http\Controllers\AdminController; use App\Http\Controllers\ItemsController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ require __DIR__.'/auth.php'; Route::get('/', [HomeController::class, 'home'])->name('home'); Route::get('/home', [HomeController::class, 'home']); Route::get('/listview', [ListviewController::class, 'listview']) ->name('lists'); Route::middleware('auth')->group (function () { Route::get('/create', [NewlistController::class, 'newlist']) ->name('create'); Route::get('/dashboard/{role}/{id?}', [DashController::class, 'dashboard']) ->name('dashboard'); Route::post('/dashboard/{role}/{id}', [NewlistController::class, 'store']); Route::get('/dashboard/{user_id}/{baby}', [BabyController::class, 'show']) ->name('baby'); Route::get('/dashboard/{user_id?}/{baby}/catalogus', [ScrapeController::class, 'show']); Route::get('/admin/{id}', [AdminController::class, 'showAdmin']) ->name('admin'); Route::post('/admin/{id}/websites/', [AdminController::class, 'storeWeb']) ->name('newWeb'); Route::delete('/admin/{id}/websites/', [AdminController::class, 'destroyWeb']) ->name('delWeb'); Route::post('/admin/{id}/categories/', [AdminController::class, 'storeCat']) ->name('newCat'); Route::delete('/admin/{id}/categories/', [AdminController::class, 'destroyCat']) ->name('delCat'); Route::post('/admin/{id}/links/', [AdminController::class, 'storeLink']) ->name('newLink'); Route::delete('/admin/{id}/links/', [AdminController::class, 'destroyLink']) ->name('delLink'); });
Replace this code
With this
Your
destroyLink()
method should contain this