问题描述
如何在 Laravel 8 中使用 slug 而不是 id
这是我在控制器中的公共函数
public function singleProduct($slug){
$product = Product::findOrFail($slug);
return view('frontend.product.product',compact('product'));
}
这是路线
Route::get('/product/{slug}',[HomeController::class,'singleProduct']);
这是单品的来源
<a href="{{ url('/product/'.$product->slug) }}" class="customBtn4">Read More</a>
解决方法
Laravel 已经提供了使用模型类中的 $primaryKey
属性显式设置主键的选项,您可以将另一列设置为主键,而不是默认的 id
列。更多信息:https://laravel.com/docs/8.x/eloquent#primary-keys
现在要使用 slug
作为默认值而不是 id
作为路由路径,请按照以下步骤操作:
第 1 步:打开您的 Product.php
模型文件并设置 $primaryKey
、$incrementing
和 $keyType
属性:
class Product extends Model
{
protected $primaryKey = 'slug'; // your column name
public $incrementing = false;
protected $keyType = 'string';
...
第 2 步:在 singleProduct
控制器文件中编辑您的 HomeController.php
方法:
public function singleProduct(Product $product)
{
return view('frontend.product.product',compact('product'));
}
仅此而已。现在您不需要先找到 slug 并检查它是否存在。 Laravel 会自动完成。
,如果你想在你的路由模型绑定中使用 slug,而不改变你的数据库表的主键,Laravel 提供了一种方法来覆盖用于具有路由模型绑定的请求的键。 所以你可以把它添加到你的模型中:
public function getRouteKeyName()
{
return 'slug';
}
允许您像这样使用它:
public function singleProduct(Product $product)
{
return view('frontend.product.product',compact('product'));
}
//
Route::get('/product/{product}',[HomeController::class,'singleProduct']);
然而,这会改变每个路由/请求的路由键,这可能不是你真正想要的。 所以更简单的方法是直接在路由上指定模型键,如下所示:
Route::get('/product/{product:slug}','singleProduct']);
这还允许您在控制器中使用它而无需额外查询:
public function singleProduct(Product $product)
//...