首页  >  问答  >  正文

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

我的处境很困难。 我正在用刮刀构建一个出生列表克隆,但很难对其进行编码,因为我经验不足。我成功创建了一个包含多个表单的管理页面,用于插入网站、类别和链接表单,您可以在其中指定应在哪个链接上进行抓取以及将链接到哪个网站和类别。不过,添加这样的东西没问题,但是删除就不行了..

我的网站、类别和链接显示在我的管理页面上,每个元素都有一个抓取和删除按钮。当我删除行中的最后一项时,它会删除第一个元素。当我想删除其他内容时,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');

});

P粉064448449P粉064448449288 天前502

全部回复(1)我来回复

  • P粉403549616

    P粉4035496162024-01-29 16:41:58

    替换此代码

    @csrf @method('DELETE') @foreach ($links as $link) @endforeach
    Url Filter selector Website Categorie
    {{ $link->url }} {{ $link->main_filter_selector }} {{ $link->website->title }} {{ $link->category->title }}

    有了这个

    
        @foreach ($links as $link)
        
        @endforeach
    
    Url Filter selector Website Categorie
    {{ $link->url }} {{ $link->main_filter_selector }} {{ $link->website->title }} {{ $link->category->title }}
    @csrf @method('DELETE')

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

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

    回复
    0
  • 取消回复