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

问题描述

如何在 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)
//...