データベースのレコードを更新する(編集フォームを作る)
これまで、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');
}