如何将路由模型绑定查找数据从 id 更改为 slug

Pet*_*Amo 4 php laravel eloquent route-model-binding laravel-8

我有一条如下所示的路线。

Route::get('/articles/{articleSlug}' , 
    [App\Http\Controllers\ArticleController::class, 'single']);
Run Code Online (Sandbox Code Playgroud)

single()at类的方法ArticleController如下:

public function single($slug)
{
    $article = Article::where('slug',$slug)->first();
    $article->increment('viewCount');

    return view('home.article',compact('article'));
}
Run Code Online (Sandbox Code Playgroud)

现在我希望使用路由模型绑定根据articles列从表中查找此数据slug。但据我所知,路由模型绑定是根据id查找数据的。那么如何将路由模型绑定查找数据从仅更改idslug仅用于ArticleController.php(意味着其他控制器类可以使用 id 作为路由模型绑定)?

Yve*_*ndo 6

如果您想使用其他模型字段作为出价属性,id您可以定义一个getRouteKeyName返回必须使用的字段名称的字段

class Article extends Model {
    // other methods goes here
    public function getRouteKeyName() {
        return 'slug';
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以在定义路由时直接传递字段名称,如下所示

Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
Run Code Online (Sandbox Code Playgroud)

使用控制器内的此代码,您必须确保路由定义中作为参数提供的名称与参数的名称controller匹配

public function single(Article $article)
{
    $article->increment('viewCount');

    return view('home.article',compact('article'));
}
Run Code Online (Sandbox Code Playgroud)