データベースのレコードを更新する(編集フォームを作る)

これまで、membersテーブルへの登録フォームと、レコードの一覧画面を作ってきました。
今回は、登録済みのレコードを編集するためのフォームを作り、レコードの更新をしてみます。

まずは必要なルーティングから書いていきます。

// 編集画面
Route::get('/members/{member_id}/edit','MembersController@edit');
// 更新処理
Route::put('/members/{member_id}','membersController@update');

編集画面で編集フォームを表示して、更新処理でレコードの更新を行います。
更新対象のレコードは、ルートパラメータにmembersテーブルのidを指定することで特定します。

更新処理のルーティングは、編集フォームからPOSTリクエストされるのでRoute::post()のはずですが、今回はRoute::put()を使っています。
httpプロトコルにはGETとPOSTの2つのリクエストメソッドがあります。それぞれルーティングする場合は、Route::get()とRoute::post()を使いますね。
Laravelでは、これ以外にPUTやDELETEといったリクエストメソッドが使えます。これを擬似フォームメソッドといいます。
リクエストメソッドは処理の内容によって使い分けます。
・GET … 情報の取得
・POST … 情報の登録
・PUT … 情報の更新
・DELETE … 情報の削除
今回はレコードの編集処理なのでPUTを使います。

コントローラを書いていきます。
編集画面のメソッドから作っていきましょう。

    // 編集画面
    public function edit($member_id) {
        $members = DB::select('SELECT * FROM members WHERE id = ?;',[
            $member_id
        ]);

        return view('members.edit',[
            'member' => $members[0]
        ]);
    }

編集画面のビューを作ります。

<html>
<body>
    @if($errors->any())
        <ul>
            @foreach($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    @endif
    <form method="POST" action="/members/{{ $member->id }}">
        @method('put')
        @csrf
        <p>
            name<br>
            <input type="text" name="name" value="{{ old('name',$member->name) }}">
        </p>
        <p>
            age<br>
            <input type="text" name="age" value="{{ old('age',$member->age) }}">
        </p>
        <p>
            <input type="submit" value="send">
        </p>
    </form>
</body>
</html>

このフォームの送信先はRoute::put()でルーティングされています。PUTルートにフォームを送信する場合は、formタグのmethod属性はPOSTにして、form内に@methodディレクティブを書きます。@method(‘PUT’)とすると、このフォームの送信はPUTリクエストになります。

更新処理のメソッドを書きます。

    //更新処理
    public function update(MemberRequest $request, $member_id) {
        DB::update('UPDATE members SET name = ?, age = ? WHERE id = ?;',[
            $request->name,
            $request->age,
            $member_id
        ]);

        return 'updated!!';
    }

これで編集画面と更新処理が完成しました。


編集フォームが完成したら、以前に作成した一覧画面の各行に、それぞれのレコードの編集リンクを設けてみましょう。また、編集完了後に、一覧画面に戻るようにしてみましょう。

<html>
<head>
</head>
<body>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>名前</th>
            <th>年齢</th>
            <th>登録日時</th>
            <th>編集</th>
        </tr>
    </thead>
    <tbody>
        @foreach($members as $member)
        <tr>
            <td>{{ $member->id }}</td>
            <td>{{ $member->name }}</td>
            <td>{{ $member->age }}</td>
            <td>{{ $member->registed_at }}</td>
            <td><a href="/members/{{ $member->id }}/edit">編集</a></td>
        </tr>
        @endforeach
    </tbody>
</table>
</body>
</html>
    //更新処理
    public function update(MemberRequest $request, $member_id) {
        DB::update('UPDATE members SET name = ?, age = ? WHERE id = ?;',[
            $request->name,
            $request->age,
            $member_id
        ]);

        // リダイレクト処理
        return redirect('/members');
    }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です