如何在laravel 8中使用slug而不是id

如何在laravel 8中使用slug而不是id,laravel,laravel-8,slug,Laravel,Laravel 8,Slug,如何在laravel 8中使用slug而不是id 这是我在控制器中的公共功能 public function singleProduct($slug){ $product = Product::findOrFail($slug); return view('frontend.product.product', compact('product')); } 这就是路线 Route::get('/product/{slug}', [HomeControlle

如何在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
列以外的主键。更多信息:

现在要使用
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:在
HomeController.php
controller文件中编辑
singleProduct
方法:

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}', [HomeController::class, 'singleProduct']);
但是,这将更改每个路由/请求的路由密钥,而这可能不是您真正想要的。 因此,更简单的方法是直接在管线上指定模型关键点,如下所示:

public function singleProduct(Product $product)
{
    return view('frontend.product.product', compact('product'));
}
// 
Route::get('/product/{product}', [HomeController::class, 'singleProduct']);
Route::get('/product/{product:slug}', [HomeController::class, 'singleProduct']);
这也允许您在控制器中使用它,而无需额外查询:

public function singleProduct(Product $product)
//...
findOrFail()
方法接受和
id
,您需要更改
$product=product::where('slug',$slug)->firstOrfail()