やりたいこと
口コミサイトを制作しています。今回は、
- ユーザーが自分が投稿した口コミをポチッと選択すると、
- 口コミ編集ページに飛んで、
- その口コミのレコードをDBから呼び込んで表示し、
- それを編集できる
という機能を実装したいです。
Laravelの某教科書を参照したところ、3,4は説明があってありがたいのですが、1,2のプロセスに関しては「/person/edit/id=番号というように、idパラメータを付けてアクセスをして下さい」と、要は「君の手でレコードのidをURLで打ってみ?表示されるべ?」で終わっていて、まさか自分のサービスを使ってくれるユーザーに直接手で/edit/id=XXとか打たせるわけにはいかないので、自分で考えて作ってみました。
私たち教わる側も、「教科書は絶対的であり、A->Zまで全てを教えてくれる!」という姿勢を改めないといけませんね。教科書も私たちに考える余白を与えてくれていると前向きに考えた方が良さそうです。
環境:Laravel 7.26.1、Eloquent ORM(DBクラスで実装している方も参考になると思います!)
やってみた
最初から解決方法を書きますが、超シンプルです。しかもこのステージまで来れた方なら既にDBのレコード(投稿内容でもユーザー名でも何かしら)をブラウザに表示することには成功していると思うので、もしそうなら本当に一瞬です。
今回は投稿を例にとって説明を続けていきます。
要は、ユーザーがある特定の投稿の編集ボタンを押したら、?id=番号
のURLを生成すればいいわけです。URLにパスを渡すのはHTMLのaタグさんちのhref属性くんの仕事です。
なので、だいぶ簡易的にコードを書きますがbladeでこんな感じ↓にすればOKです。($items
、`$itemは後で説明します)
@foreach ($items as $item)
<div>{{$item->title}}</div>
<div>{{$item->text}}</div>
<a href="edit?id={{$item->id}}">編集する</a>
@endforeach
こんな風に、href="edit"に?id={{$item->id}}
を加えるだけです。
titleとtextは投稿のタイトルと本文で、この記事にたどり着くような方だったらもう既にこのようなプログラムは書けていると想像します。
$itemは今回下記のようにコントローラ内で定義したDBのレコードが代入されています。
class ReviewController extends Controller
{
public function index(Request $request)
{
$items = Review::all(); //投稿の格納されたreviewsテーブルにアクセスするReviewモデルからレコードを取得
return view('index', ['items' => $items]); //views直下のindexファイルにitemsという名前で$itemsを渡して返す
}
この状態でindex.blade.phpで「編集する」リンクをクリックすれば、当該レコードのidの番号を持ったクエリ文字列(edit?id=1)が生成されるはずです!
ちなみに、ルートのアドレスが気になるところですが、下記のように?id=番号
的なものをつけずに'edit'のままでも、うまくページ遷移しました。
Route::get('edit', 'ReviewController@edit');
以上になります。
もしわかりづらい点、誤りなどなど、何かご指摘あれば、ぜひコメント下さい!