LaravelでURLのslugの値をidカラム以外のカラムの値にする方法

LaravelでURLのslugの値をidカラム以外のカラムの値にする方法

1578 回閲覧されました

みなさんこんにちはjonioです。

Laravelで記事を投稿して↓の様に一覧(画像が3つある部分)を表示したとします。

そして記事のどれかをクリックして記事の中身を見るとURLの末尾はidカラムの値になっています。

これを↓の様にid以外のカラムの値を使う事ができる様にします。

それでは説明します。

 

Laravelのバージョンと使うモデル

Laravelのバージョンは8です。

モデルはWorkを使うとします。

 

Implicit Binding(インプリシットバインディング)

まずはLaravelではどうやってURLの末尾(↓の赤枠)が決められているかを知っておかないといけません。

Implicit Bindingという機能を使っているのですがそれついて説明します。(調べた内容なので間違っていたら申し訳ありません)

ルーティングを↓にしたとします。

「{work}」のworkはモデル名を小文字にします。(モデルはWorkです)

この時コントローラーは↓になります。

ルーティングの「{work}」のworkと1行目の「Work $work」のwork($を取ります)が同じになっていますがこの時にImplicit Bindingという機能でモデル(今回はWork)のid属性の値がurlの最後に付く様にデフォルトで設定されています。

ちなみにWorkがモデル名で$workがidカラムの値になります。

この時の投稿内容の一覧ページ のビューは↓になります。

ルーティングの「{work}」のworkとコントローラーの「Work $work」のworkとビューの「[‘work‘ => $work]」のworkは同じにします。

ではURLの最後の文字をidカラム以外のカラムの値になるための記述をします。

まずはルーティングです。

 

ルーティング

web.phpのコードを↓にします。

次はコントローラーです。

 

コントローラー

コードを↓にします。

次は記事一覧を表示するビューです。

 

記事一覧を表示するビュー

ビューのコードを↓にします。(記事を表示している部分のみ記載します)

最後はURLを変える為のコードです。

 

モデル

今回はWorkモデルを使っているので使っている(Work)モデルの中に記述を追加します。

14行目のgetRouteKeyNameメソッドでURLの末尾を変更することができます。

15行目の「slug」ですがslugカラムの事で使いたいカラム名にして下さい。(title・body・eyecatchなどどれを使ってもちゃんと表示されます)

今回の実装に当たって使ったworksテーブルを載せておきます。

これで完成です。