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テーブルを載せておきます。
これで完成です。