在 Laravel 8 中为 crud 显示 slug 而不是 id
Posted
技术标签:
【中文标题】在 Laravel 8 中为 crud 显示 slug 而不是 id【英文标题】:Showing slug instead of id for crud in Laravel 8 【发布时间】:2021-01-18 15:17:00 【问题描述】:我正在对我的 laravel crud 项目进行编辑部分。当我按下编辑时,它将重定向到edit.blade.php
,它将调用蛞蝓而不是他们的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');
我的 ProductController::edit()
public function edit(Product $product, $slug)
return view('edit', compact('product'));
我的 ProductController::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');
任何帮助将不胜感激,在此先感谢
【问题讨论】:
该编辑路由的 URI 中没有路由参数,更新可能不是 GET 路由 看看laravel.com/docs/8.x/routing#route-model-binding 【参考方案1】:您无需担心任何事情。只需将以下代码添加到您的产品模型中:
public function getRouteKeyName()
return 'slug';
Laravel 会处理剩下的事情。欲了解更多信息,请访问下面的链接,那里有很好的解释:
https://laravel.com/docs/8.x/routing#customizing-the-default-key-name
【讨论】:
【参考方案2】:在您的编辑按钮中传递 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');
【讨论】:
【参考方案3】:您收到此错误是因为您的方法中有 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'])
【讨论】:
以上是关于在 Laravel 8 中为 crud 显示 slug 而不是 id的主要内容,如果未能解决你的问题,请参考以下文章
使用 modal 的 Laravel 8 crud 不向数据库添加数据