2018/10/12

データベースの基本操作はCRUD(Create, Read, Update, Delete)と呼ばれます。
これまでのチュートリアルで、Create、Read、Updateをやりました。
今回はCRUDの最後であるDelete処理をやります。
レコードの削除
レコードの削除処理は簡単です。処理の大まかな流れは以下のようになります。
1 ) findOrFailで送られたパラメータのIDのレコードをModelインスタンスとして取得
Modelインスタンス = モデル::findOrFail($id);
2) Modelインスタンスに対しdeleteメソッドを呼び出す
Modelインスタンス ->delete();
これでパラメータ($id)で指定されたレコードが削除されます。
隠しメソッドについて
前回、編集画面を作成するときにフォームからの入力データをpatchメソッドでリクエストを発行しUPDATE処理をしました。
今回のdelete処理をするときにはDELETEメソッドでリクエストを発行する必要があります。
このときformタグのmethodにDELETEを指定しても、HTML formがそもそもこれらのメソッドに対応していないため、リクエストを発行できません。
こういうときは、formで一旦POSTメソッドを指定して、hiddenで_methodプロパティ(隠しメソッド)を投げます。
<form method="post" action="/sample/100"> <input name="_method" type="hidden" value="DELETE"> :
Laravelのヘルパー関数を使うと記述が短くてすみます。
{{ method_field('delete') }}
ちなみにDBの処理(CRUD)ごとにHTTPリクエストメソッドを変えることを "RESTful" といいます。
Create、Read、Update、Deleteの各機能に対するHTTPリクエストメソッドは以下のようになります。
DBのCreate処理 ⇒ POSTメソッド
DBのRead処理 ⇒ GETメソッド
DBのUpdate処理 ⇒ PUT/PATCHメソッド
DBのDelete処理 ⇒ DELETEメソッド
チュートリアル
実現したいこと
以前作成した簡易フォームに削除ボタンを追加します。
削除ボタンを押したらすぐに削除するのではなく、前段階としてJavascriptで確認メッセージを出します。
手順
1. Viewファイルに削除ボタンを追加
DBのTABLEを一覧表示している all.blade.php に削除ボタンをつけます。
{{-- 子テンプレート --}}
{{-- resources/all.blade.php --}}
@extends('layouts.master')
@section('title', '入力した内容を表示するサンプルページ')
@section('content')
{{$message}}
<table class="table table-striped">
<!-- loop -->
@foreach($data as $val)
<tr>
<td>{{$val->id}}</td>
<td>{{$val->onamae}} さん</td>
<td><a href="{{ action('GreetingController@edit', $val->id) }}" class="btn btn-primary btn-sm">編集</a></td>
<td>
<!-- ↓↓↓今回記述した箇所 ↓↓↓ -->
<form action="{{ action('GreetingController@destroy', $val->id) }}" id="form_{{ $val->id }}" method="post">
{{ csrf_field() }}
{{ method_field('delete') }}
<a href="#" data-id="{{ $val->id }}" class="btn btn-danger btn-sm" onclick="deletePost(this);">削除</a>
</form>
<!-- ↑↑↑ 今回記述した箇所 ↑↑↑ -->
</td>
</tr>
@endforeach
</table>
<!-- ↓↓↓今回記述した箇所 ↓↓↓ -->
<script>
<!--
/************************************
削除ボタンを押してすぐにレコードが削除
されるのも問題なので、一旦javascriptで
確認メッセージを流します。
*************************************/
//-->
function deletePost(e) {
'use strict';
if (confirm('本当に削除していいですか?')) {
document.getElementById('form_' + e.dataset.id).submit();
}
}
</script>
<!-- ↑↑↑ 今回記述した箇所 ↑↑↑ -->
@endsection
2. ルーティングの設定
routes.phpに以下の1行を追加します。
deleteメソッドで greeting/destroy/パラメータ にアクセスがあった場合GreetingControllerのdestoroyメソッドを実行。
# 削除
Route::delete('greeting/destroy/{id}', 'GreetingController@destroy');
3. Controllerの修正
GreetingController.phpにdestoryメソッドを記述します。
削除処理が終わったら一覧ページのViewファイルを呼び出します。
#レコードの削除
public function destroy($id)
{
#削除処理
$greeting = Greeting::findOrFail($id);
$greeting->delete();
#greetingsテーブルのレコードを全件取得
$data = Greeting::all();
return view('all')->with('message', '削除しました。')->with('data',$data);
}
4. 動作確認
http://mylaravel/greeting/all にアクセス

IDが "12" の "Laravelさん" の削除ボタンを押します。
JavaScriptの確認メッセージが開いきました。

"OK" を押して以下の画面のようにレコードが削除されれOKです。

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。