12. レコード更新・削除
データ更新
find()
find() は指定した「id」からレコードを1件取得するメソッドです。
Model::find(int id);
SQL
SELECT * FROM テーブル名 WHERE id = ID;
update()
update() はレコード更新するメソッドで、データは連想配列で指定します。
Model::update(連想配列);
すべてのレコードを更新
条件を指定しない場合は、すべてのレコードを更新されるので注意が必要です。
SQL
UPDATE テーブル名 SET (カラム1 = 値1, カラム2 = 値2, ...);
where()
where() は、SQLのWHERE句を追加するメソッドです。
Model::where(カラム名, 値, オプション);
オプションなしの場合
where() のオプションがない場合は、条件が = で実行されます。
SQL
WHERE カラム名 = 値
WHEREで更新
レコード更新は通常WHEREで条件指定しますが、Eloquentではメソッドチェーンでコーディングできます。
モデル::where(カラム名, 値)->update(連想配列);
SQL
UPDATE テーブル名 SET (カラム1 = 値1, カラム2 = 値2, ...) WHERE カラム名 = 値;
セッション(Flash)
old()
old() は前回入力したセッションデータを取得するヘルパーメソッドです。セッションは1度だけ有効なFlashとして処理されます。
old(プロパティ名, 初期値)
データ送信とセッション
old() を利用すると、第1引数はセッションデータ(Flash)、第2引数はモデルデータ(DBデータ)で表示できます。
<form action="xxxx" method="post">
<!-- old() 第1引数:セッション -->
<!-- old() 第2引数:DBデータ -->
<input type="text" name="email" value="{{ old('email', $item->email) }}" >
<button>更新</button>
</form>
商品編集
商品データ取得
ItemControllerのedit() で「items」テーブルから1件取得します。
ItemController.php
public function edit(int $id)
{
$item = Item::find($id);
$data = ['item' => $item];
return view('item.edit', $data);
}
商品編集画面
フォーム追加
「item/edit.blade.php」にフォームを追加します。商品名と価格のvalueプロパティには、old() で設定します。
item/edit.blade.php
<form action="" method="post">
@csrf
<div class="form-group mb-3">
<label for="" class="form-label">商品名</label>
<input type="text" class="form-control" name="name" value="{{ old->('item', $item->name) }}">
</div>
<div class="form-group mb-3">
<label for="" class="form-label">価格</label>
<input type="number" class="form-control" name="price" value="{{ old->('item', $item->price) }}">
</div>
<div>
<button class="btn btn-primary w-100">更新</button>
</div>
</form>
フォーム送信URL
フォームのactionは「item/update/{id}」の形式で設定します。
item/edit.blade.php
<form action="{{ route('item.update', $item->id) }}" method="post">
...
</form>
- route() の第2引数に値を指定すると、自動的にパスパラメータが生成
レコード更新
ルーティング
POSTリクエスト「/item/update/{id}」をルーティングします。
web.php
Route::post('/item/update/{id}', [ItemController::class, 'udpate'])->name('item.udpate');
レコード更新処理
トークン削除
ItemControllerのupdate() ではリクエストデータ取得します。データにはCSRF処理対策の「_token」データが含まれているため、事前に削除しておきます。
ItemController.php
public function update(Request $request, $id)
{
$posts = $request->all();
unset($posts['_token']);
}
レコード更新
商品データの更新し、編集画面にリダイレクトします。
ItemController.php
public function update(Request $request, $id)
{
$posts = $request->all();
unset($posts['_token']);
Item::where('id', $id)->update($posts);
return redirect()->route('item.edit', $id);
}
- 編集画面へのリダイレクトURLには「items.id」が必要です。
レコード削除
destroy()
destroy() はレコード削除するメソッドで、基本的にはテーブルのidを指定します。
Model::destroy(int $id);
SQL
DELETE FROM テーブル名 WHERE id = :id;
delete()
delete() は、選択したレコードを削除するメソッドです。where() と併用して実行します。
Model::where(条件)->delete();
SQL
DELETE FROM テーブル名 WHERE 条件;
レコード削除処理
Rouging
POSTリクエスト「/item/destroy/{id}」をルーティングします。
web.php
Route::post('/item/destroy/{id}', [ItemController::class, 'destroy'])->name('item.destroy');
Controller
商品データを削除し、処理後は「item/index」にリダイレクトします。
ItemController.php
public function destroy(int $id)
{
Item::destroy($id);
return redirect()->route('item.index');
}
View
「edit.blade.php」にフォームボタンを追加し、「item/destroy/{id}」にPOSTリクエストします。
edit.blade.php
<div>
<form action="{{ route('item.destroy', $item->id) }}" method="post">
@csrf
<button class="btn btn-danger w-100 mb-2">削除</button>
</form>
</div>
動作確認
削除処理の動作確認をしてみましょう。