如何在laravel 8中使用slug而不是id
如何在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
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()代码>