LoginSignup
2
0

More than 3 years have passed since last update.

Laravelでクエリ文字列(URLの末尾に?id=1とか付け足すやつ)を生成するには?

Last updated at Posted at 2020-09-18

やりたいこと

口コミサイトを制作しています。今回は、
1. ユーザーが自分が投稿した口コミをポチッと選択すると、
2. 口コミ編集ページに飛んで、
3. その口コミのレコードをDBから呼び込んで表示し、
4. それを編集できる

という機能を実装したいです。
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は後で説明します)

index.blade.php
@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');

以上になります。
もしわかりづらい点、誤りなどなど、何かご指摘あれば、ぜひコメント下さい!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0