Laravel5で削除ページの作成

前回は、修正ページを作成しました。本日は、削除ページを作成したいと思います。削除ページといってもindexページ内のTwitterブートストラップのモーダルを利用して作成します。

indexビューファイルの修正

まず最初にindexビューファイルを下記のように修正します。

app/resources/views/gather/index.blade.php

@extends('app')
@section('content')
<div class="container">
 <h2>コレクション一覧</h2>
 <table class="table table-striped">
 <tr>
 <th>名前</th>
 <th>Code</th>
 <th>説明</th>
 <th>処理</th>
 </tr>
 @foreach($gathers as $gather)
 <tr>
 <td>{{ $gather->name }}</td>
 <td>{{ $gather->code }}</td>
 <td>{{ $gather->description }}</td>
 <td>
 <a href="{{url('gathers/update',$gather->id)}}"><span class="glyphicon glyphicon-pencil"></span>修正</a>&nbsp;
 <a href="#" data-toggle="modal" data-target="#deleteModal{{$gather->id}}"><span class="glyphicon glyphicon-remove"></span>削除</a>
 </td>
 </tr>
 <div class="modal fade" id="deleteModal{{$gather->id}}">
 <div class="modal-dialog">
 <div class="modal-content">
 <div class="modal-header">
 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
 <h4 class="modal-title alert alert-danger">『{{$gather->name}}』の削除</h4>
 </div>
 <div class="modal-body">
 <p>本当に削除してもいいですか</p>
 </div>
 <div class="modal-footer">
 {!! Form::open(['url'=>'gathers/delete']) !!}
 {!! Form::hidden('id',$gather->id) !!}
 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
 <input type="submit" class="btn btn-danger" value="削除">
 {!! Form::close() !!}
 </div>
 </div><!-- /.modal-content -->
 </div><!-- /.modal-dialog -->
 </div><!-- /.modal -->
 @endforeach
 </table>
 {!! $gathers->setPath('gathers') !!}<br>
 <a href="{{ url('gathers/create') }}" type="button" class="btn btn-primary btn-lg">新規作成</a>
</div>
@endsection

19行目:Twitter BootstrapのModalを使用して、削除用のポップアップページを表示します。foreachで回していますので、id名が重複しないように、data-targetは、”#deleteModal{{$gather->id}}として、deleteModalの後に、id番号が付与するようにしています。

22-41行目:削除用のポップアップページ(Modal)用のタグです。

22行目:idに19行目のdata-targetと同じ値(”deleteModal{{$gather->id}}”)を指定しています。

34-38行目:削除用データのidをhidden要素としてGathersコントローラのdeleteメソッドに送信します。

ブラウザで表示してみましょう。

2015-05-23 19-05-59

これで、削除ボタンをクリックすれば、GathersコントローラのpostDeleteへ、idを引き渡します。

postDeleteアクションの作成

次に、postDeleteアクションを下記のように作成します。

app/Http/Controllers/GathersController.php

public function postDelete(Request $request)
 {
 $gather=Gather::find($request->id);
 $gather->delete();
 return redirect()->to('gather');
 }

これで、データを削除することができます。

ソフトデリート

只、このままでは、間違って削除しても復活することはできません。そこで、Laravelで用意されているソフトデリート機能を使用したいと思います。

ソフトデリートとは、データベースからデータを実際に削除する代わりに、deleted_atカラムにタイムスタンプがセットされているデータをEloquentモデルからデフォルトで抽出できないようにする機能です。Eloquentモデルのdelete()メソッドを使用すると、データを削除する代わりに、delete_atカラムにタイムスタンプが自動的に入力されます。

このソフトデリート機能を使用するには、SoftDeletsトレイトを適用します。Gatherモデルに下記のように修正します。

app/Gather.php

<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDelets;
class Gather extends Model {
//複数代入のホワイトリスト
 protected $fillable=['name','code','description'];
//ソフトデリート
 use SoftDeletets;
 protected $dates=['deleted_at'];
}

Laravelの以前のバージョンでは、SoftDeletingTraitになっていましたが、現在、SoftDeletingTraitがSoftDeletsに変更になっていますので注意してください。

尚、ソフトデリートを使用するには、データベーステーブルにdeleted_atカラムが必須ですので、マイグレーションで、softDeletesメソッドを使用してください。

$table->SoftDeletes();

尚、手動で、追加する場合は、必ず追加したdeleted_atカラムのデフォルト値をNULLに設定してください。

ソフトデリートしたデータをphpMyAdminで確認してみると、下記のようにdeleted_atカラムにタイムスタンプが入力されているのが確認できます。

2015-05-23 20-45-18

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ