LARAVEL:foreach 中的所有元素都具有 id 1,这使得删除它们变得不可能

LARAVEL: All elements from foreach have the id 1, which makes deleting them impossible

我处境艰难。 我正在用刮刀构建一个出生列表克隆,但很难对其进行编码,因为我没有那么有经验。我设法创建了一个管理页面,其中包含多个表单以插入网站、类别和一个 link 表单,您可以在其中指定 link 应该进行哪些抓取以及将抓取到哪个站点和类别link编辑。不过这样的东西加起来没问题,删了就不行了..

我的网站、类别 en links 显示在我的管理页面上,每个元素都有一个抓取和删除按钮。当我删除行中的最后一项时,它会删除第一个元素。当我想删除其他东西时,laravel 抛出一个异常,它试图在 null 上读取 属性,这意味着它不再存在。当我在删除函数之前转储并死亡时,每个列表中的每个项目都有 id '1'。这就是为什么它会删除一行中的第一项。谁能帮帮我?

我认为这是因为请求删除项目的 ID 是从 url 中检索到的,而 url 中给出的 ID 是用户 ID,即 1。所以如果有人可以给我提示以确保我可以以不同的方式提供用户的 ID。让我知道! 我的代码:

管理员控制器:

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

    }
}

我的管理页面:


<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>

我的路线:

<?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');

});
    

替换此代码

<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>

有了这个

<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">
            <form action="{{ route('delLink', $link->id) }}" method="POST">
                @csrf
                @method('DELETE')
                <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>
            </form>
        </td>
    </tr>
    @endforeach
</table>

你的destroyLink()方法应该包含这个

public function destroyLink(Request $request)
{  
    $id = $request->id;
    $link = Link::find($id);
    $link->delete();
    return back();
}