微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。