在 Laravel 8 中显示 slug 而不是 id 进行 CRUD

问题描述 投票:0回答:4

我正在我的 laravel crud 项目上创建一个编辑部分。当我按下编辑键时,它将重定向到

edit.blade.php
,它将调用 slug 而不是它们的 id。我已经解决了,它显示了错误
Too few arguments to function App\Http\Controllers\ProductController::edit(), 1 passed and exactly 2 expected 

我的路线

Route::get('edit/{slug}', $url. '\productController@update');
Route::get('edit', $url. '\productController@edit');

我的产品控制器::edit()

public function edit(Product $product, $slug)
    {
        return view('edit', compact('product'));
    }

我的产品控制器::update()

public function update(Request $request, Product $product, $slug)
    {
        Product::where('product_slug',$request->$slug)->update([
            'product_title' => $request->title,
            'product_slug'  => $request->slug,
            'product_image' => $request->image
            ]);

            // redirect
            return redirect('edit');
    }

任何帮助将不胜感激,提前致谢

laravel crud slug
4个回答
13
投票

您无需担心任何事情。只需将以下代码添加到您的产品模型中即可:

public function getRouteKeyName()
{
    return 'slug';
}

Laravel 会处理剩下的事情。欲了解更多信息,请访问下面的链接,他们有很好的解释:

https://laravel.com/docs/8.x/routing#customizing-the-default-key-name


0
投票

您收到此错误是因为您的方法中有 2 个参数:

Product $product
$slug
。要解决此错误,您应该删除其中一个。

您还需要将

slug
参数添加到
edit
路线中,以便在控制器中访问它。您的
update
路线应该是
PUT
PATCH

类似这样的:

Route::get('products/{slug}/edit', [ProductController::class, 'edit'])
Route::patch('products/{slug}', [ProductController::class, 'update'])

因此,您可以删除

Product $product
并使用
$slug
来获取产品:

public function edit($slug)
{
  $product = Product::where('product_slug', $slug);

  return view('edit', compact('product'));
}

public function update(Request $request, $slug)
{
  Product::where('product_slug', $slug)->update([
    'product_title' => $request->title,
    'product_slug'  => $request->slug,
    'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');
}

或者您可以删除

$slug
并通过将
Product $product
设置为路线键并将路线参数更改为
slug
来使用
product

// Product model
public function getRouteKeyName()
{
  return 'slug'
}

// Product controller
public function edit(Product $product)
{
  return view('edit', compact('product'));
}

public function update(Request $request, Product $product)
{
  $product->update([
    'product_title' => $request->title,
    'product_slug'  => $request->slug,
    'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');
}

// Route
Route::get('products/{product}/edit', [ProductController::class, 'edit'])
Route::patch('products/{product}', [ProductController::class, 'update'])

0
投票

在 laravel 10+ 中你可以这样做:

use App\Models\Post;

Route::get('/posts/{post:slug}', function (Post $post) {
    return $post;
});

-1
投票

在编辑按钮中传递 id 而不是 slug

<a href="{{url('edit/'$id'')}}" class="btn btn-info btn-sm" />Edit</a>

并更改您的更新功能

public function update(Request $request, Product $product, $id)
{
    Product::where('id_column_name', $id)->update([
        'product_title' => $request->title,
        'product_slug'  => $request->slug,
        'product_image' => $request->image
        ]);

        // redirect
        return redirect('edit');
}
© www.soinside.com 2019 - 2024. All rights reserved.