データの更新方法
Laravelでデータを更新するには新しいHTTPメソッドを使用します。更新用のメソッドはPutとPatchがあります。二つの違いは以下の通りです。
PutとPatchの違い
Put
Putはリソース全体を更新するときに使用します。リクエストボディには更新するすべてのデータを含む必要があります。
Patch
Patchはリソースの一部を更新するときに使用します。リクエストボディには更新に必要なデータだけデータを入れておけばよいです。
Laravelでのデータ更新
今回はitemsテーブルに更新できる要素が一つしかない(idは更新不可能で、タイムスタンプも更新不可能)ので、Putメソッドで全部更新したいと思います。データを更新するためのビューを新たに作ります。edit-item.balde.phpを新たに作成します。ソースコードは以下の通りです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Itemの更新</title>
</head>
<body>
<form action="{{ route('items.update', $item) }}" method="POST">
@csrf
@method("PUT")
<p>name</p>
<input type="text" name="name" value="{{ $item->name }}">
<button type="submit">更新</button>
</form>
</body>
</html>
まず、@methodでHTTPメソッドを指定します。これは、formタグがGetとPostしかサポートしていないため、Laravelが拡張しているものです。また、input要素のvalueに初期値を指定することで、画面アクセス時に初期値を入力欄に表示させそれを変更する方式をとるためです。
次に、コントローラーを作成します。以下のメソッドをコントローラーに追加します。
public function editItem(Item $item) {
return view("edit-item", compact("item"));
}
public function updateItem(Request $request, Item $item) {
$item->name = $request->input("name");
$item->save();
return redirect()->route("items.edit", compact("item"));
}
editItemメソッドはupdate-itemビューを表示するためのメソッドで、Itemを引数にとることで、更新するべきデータを特定しています。Itemの指定はURLで行います。updateItemメソッドはitemsテーブルの更新を行うメソッドで、指定されたItemと送られてきたRequestをもとにデータを更新します。
データベースの更新方法は、モデルのプロパティを上書きしてsaveメソッドで保存する方法のほかに、updateメソッドを使用する方法もあります。updateメソッドを使用する方法は以下の通りです。
public function updateItem(Request $request, Item $item) {
$item->update([
"name" => $request->input("name"),
]);
return redirect()->route("items.edit", compact("item"));
}
前者の方法はモデルのfillableの影響を受けないため、どのような要素でも、データベースにカラムがある場合は変更可能となります。また、イベントと呼ばれるものが発生します。後者の方法はモデルのfillableの影響を受け、意図せぬデータの変更を防げますが、イベントは発生しません。また、後者の方法はデータの更新が行われない(変更前と変更後の値が同じ)場合でも、update_atという、更新日時を記録するカラムは更新されます。前者の方法は変更前と変更後の値が異なる場合にデータベースの更新を行います。今回は後者の方法を使用します。
次に、ルーティングを記述します。web.phpに以下の記述を追加します。
Route::controller(HelloController::class)->group(function () {
Route::get("/update-item/{item}", "editItem")->name("items.edit");
Route::put("/update-item/{item}", "updateItem")->name("items.update");
});
ここで、{item}とは、ルートモデルバインディングに使用されるものです。ルートモバイルバインディングとは、例えば、http://localhost/update-item/3とすれば、idが3のitemが自動で取得される機能のことです。Laravelではこのような機能を実装することで、モデルを使用したデータベースの処理を簡単にしています。
http://localhost/update-item/1にアクセスしてみます。入力欄に既に表示されている値を消して、新たな値を入れます。その後、更新ボタンを押します。ターミナルでMySQLにログインし、以下のコマンドで、更新が反映されているか確認します。
select * from items;
無事、変更されていたら成功です。
今回はデータベースの更新についてみてきました。データベースを更新するにはHTTPメソッドのPutか、Patchを使用します。今回は交信できるフィールドが一つしかなく、必ず値が更新される前提でPutを使用しました。次回は、データの削除を解説します。