Проблема с отображением данных, которые я хочу удалить в отношениях «многие ко многим» в Laravel - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть много ко многим отношениям между пользователями и таблицей продуктов, и я настроил представление (welcome.blade.php), что когда я нажимаю на название продукта, которое является ссылкой, оно должно перенаправить меня на страницу, гдемоя форма удаления, так что я могу удалить этот конкретный продукт, но я получаю страницу 404 не найден.Я подозреваю, что ошибка где-то в моих маршрутах, но я не могу найти проблему.Кроме того, когда я нажимаю на какой-либо продукт, мой URL говорит о проекте / destroy / 1, что я считаю хорошим.Вот мой код:

web.php:

Route::get('/home', 'HomeController@index')->name('home');
Route::post('/store', 'HomeController@store')->name('store');
Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');

destroy.blade.php:

<div class="col-md-12">
    <form action="destroy/{{ $product->id }}" method="POST">
     @csrf
     @method('DELETE')
        <button type="submit" class="btn btn-danger">Delete</button>
    </form>
</div>

welcome.blade.php:

@if($products)
<table class="table">
    <thead>
        <th>#</th>
        <th>Product Name</th>
        <th>Owner Of The Product</th>
        <th>Created At</th>
    </thead>
    <tbody>
    @foreach ($products as $product)
        <tr>
            <td>{{ $product->id }}</td>
            <td>
                <a href="{{ route('destroy', $product->id) }}">{{ $product->files }}</a>
            </td>
            <td>
                @foreach ($product->users as $user) {{ $user->name }}
                @endforeach
            </td>
            <td>{{ date('M j, Y', strtotime($product->created_at)) }}</td>
        </tr>
     @endforeach
     </tbody>
     </table>
 @endif

HomeController.php:

<?php

namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class HomeController extends Controller
{
    public function destroy(Product $product)
    {
        $product->users()->detach();
        $product->delete();
        return view('destroy');
    }
}

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Вы определили следующий маршрут в вашем файле.

Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');

Это создаст маршрут DELETE . DELETE маршруты предназначены для доступа через API.Ссылки в тегах привязки используют маршруты GET .Нажатие на

<a href="{{ route('destroy' , $product->id) }}">{{ $product->files }}</a>

заставляет маршрутизатор пробовать и сопоставлять GET /destroy/{$id}, который не определен, поэтому он генерирует либо исключение, если включена отладка, либо 404, если нет.Вы можете увидеть это в действии, посмотрев вкладку сети консоли разработчика вашего браузера.

Если вы не добавите еще один маршрут GET , вы получите 404 с.

Route::get('/destroy/{$id}', 'HomeController@destroy')->name('product.destroy-form');

заставит работать следующую ссылку.

<a href="{{ route('product.destroy-form' , $product->id) }}">{{ $product->files }}</a>

Кроме того, в методе destroy вы возвращаете представление без передачи переменных, но в destroy.blade.php вы, похоже, используете $product.Не забудьте добавить его!

0 голосов
/ 10 апреля 2019

Ты почти у цели, просто у тебя слишком много шагов.

Хороший вызов формы и использование метода delete, это абсолютно то, что вы должны делать

Однако, если вы идете не так, используйте ссылку для перехода на отдельную страницу с формой для удаления. Вам лучше использовать небольшой javascript, чтобы ссылка передавала скрытую форму из ссылки.

<a onclick="document.getElementById('delete-form-{{$product->id}}').submit();}">{{ $product->files }}</a>
<form id="delete-form-{{$product->id}}" action="{{ route('destroy', ['id' => $product->id]) }}" method="POST" style="display: none;">
    @csrf
    @method('delete')
</form>

Вы можете использовать метод, который у вас есть, но вам нужен дополнительный маршрут: получить запрос на страницу, которая загружает форму, а затем вы можете отправить форму на этой странице для удаления.

0 голосов
/ 09 апреля 2019

Я думаю, это потому, что для удаления товара с использованием новой страницы первое, что нужно сделать, это перейти на ту страницу, которую вы не делаете.Вместо этого вы переходите непосредственно к функции удаления, используя

Route::delete('/destroy/{$id}', 'HomeController@destroy')->name('destroy');

. Вам нужно определить маршрут, который позволит вам сначала перейти на эту страницу, что вы можете сделать, создав маршрут, подобный следующему:

Route::get('/delete/{$id}', 'HomeController@delete')->name('delete');

Вы должны создать новую функцию delete в HomeController, которая просто возвращает destroy.blade.php.Что-то вроде этого.

$product= Product::find($id);
    return view('destroy')->with('product', $product);

, где $ id - это идентификатор продукта, а Product - модель, которую вы используете.

...