如何在 URL 中显示名称而不是 Id?

问题描述 投票:0回答:1

我有一个看起来像这样的路线

/collections/1 
我希望它看起来像这样
/collections/name
实例名称存储在我的数据库中并且是唯一的,我希望它显示在 URL 而不是 Id 中

这是我的路线:

Route::get('/collections/{id}', [SousCategorieController::class, 'show']);

这是我的控制器代码:

public function show(Sous_categorie $sous_categorie, $id)
{

    //dd($id);
    $count = DB::table('produits')->select('produits.sous_categorie_id')->where('produits.sous_categorie_id', '=', $id)->get();
    //return response()->json($count);
    $s_marque = DB::table('produits')
        ->select('marque')
        ->join('sous_categories', 'sous_categories.id', '=', 'produits.sous_categorie_id')
        ->whereIn('sous_categories.categorie_id', [$id])->get();
    //dd($s_marque);
    $f_categorie = DB::table('sous_categories')->select('*')->where('categorie_id', '=', $id)->get();
    $s_produits = DB::table('produits')
        ->select('produits.*', 'sous_categories.categorie_id as laravel_through_key')
        ->join('sous_categories', 'sous_categories.id', '=', 'produits.sous_categorie_id')
        ->whereIn('sous_categories.categorie_id', [$id])
        ->paginate(8)->withQueryString();
    //dd($s_produits);
    $product = Produit::orderBy('id', 'DESC')->paginate(12)->withQueryString();
    $prods = Produit::with('souscategories')->orderBy('id', 'DESC')->paginate(8)->withQueryString();
    $categories = Categorie::all();
    $sous_categorie = DB::table('sous_categories')->select('*')->where('categorie_id', 'like', '%' . $id . '%')->get();
    //$s_produits = DB::table('produits')->select('*')->where('sous_categorie_id','like','%'.$id.'%')->get();
    //return response()->json($s_produits);

    return view('collections.components', compact('sous_categorie', 'id', 'f_categorie', 'categories', 'prods', 'product', 's_produits', 's_marque', 'count'));
}

我尝试了各种解决方案,例如使用

getRouteKeyName
覆盖名称,如下所示:

public function getRouteKeyName()
    {
        return 'nom';
    }
}

并像这样改变路线:

Route::get('/collections/{collection}', [SousCategorieController::class, 'show']);

但是!我仍然得到与 id http://127.0.0.1:8000/collections/1 相同的路线。

请帮助我!
谢谢

php laravel laravel-routing
1个回答
0
投票

来自文档(强调我的):

Laravel 自动解析路由或控制器操作中定义的 Eloquent 模型其类型提示变量名称与路由段名称匹配。例如:

use App\Models\User;
 
Route::get('/users/{user}', function (User $user) {
    return $user->email;
});

因此,假设您在 URL 中引用了

Sous_categorie
模型,则需要像这样定义路由:

Route::get('/collections/{collection:nom}', [SousCategorieController::class, 'show']);

你的控制器方法是这样的:

public function show(Sous_categorie $collection): View {
...
}
© www.soinside.com 2019 - 2024. All rights reserved.