2018/10/12
データベースの基本操作はCRUD(Create, Read, Update, Delete)と呼ばれます。
これまでのチュートリアルで、Create、Read、Updateをやりました。
今回はCRUDの最後であるDelete処理をやります。
レコードの削除
レコードの削除処理は簡単です。処理の大まかな流れは以下のようになります。
1 ) findOrFailで送られたパラメータのIDのレコードをModelインスタンスとして取得
1 | Modelインスタンス = モデル::findOrFail( $id ); |
2) Modelインスタンスに対しdeleteメソッドを呼び出す
1 | Modelインスタンス -> delete (); |
これでパラメータ($id)で指定されたレコードが削除されます。
隠しメソッドについて
前回、編集画面を作成するときにフォームからの入力データをpatchメソッドでリクエストを発行しUPDATE処理をしました。
今回のdelete処理をするときにはDELETEメソッドでリクエストを発行する必要があります。
このときformタグのmethodにDELETEを指定しても、HTML formがそもそもこれらのメソッドに対応していないため、リクエストを発行できません。
こういうときは、formで一旦POSTメソッドを指定して、hiddenで_methodプロパティ(隠しメソッド)を投げます。
1 2 3 | < form method = "post" action = "/sample/100" > < input name = "_method" type = "hidden" value = "DELETE" > : |
Laravelのヘルパー関数を使うと記述が短くてすみます。
1 | {{ 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 に削除ボタンをつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | {{-- 子テンプレート --}} {{-- 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メソッドを実行。
1 2 | # 削除 Route:: delete ( 'greeting/destroy/{id}' , 'GreetingController@destroy' ); |
3. Controllerの修正
GreetingController.phpにdestoryメソッドを記述します。
削除処理が終わったら一覧ページのViewファイルを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 | #レコードの削除 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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。