WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
EloquentORMでデータの削除

EloquentORMでデータの削除

このエントリーをはてなブックマークに追加

データを削除するには慎重にならなければなりません。せっかく作成した貴重なデータが簡単に削除されないように注意しましょう。

ソフトデリートの設定

貴重なデータを守るためにLaravel4にはソフトデリートという機能がついています。では、ソフトデリートの設定を行いましょう。

deleted_atカラムの追加

データベーステーブルにソフトデリート用のカラムを作成します。ルーターに下記のように記述します。phpMyAdminで作成してもいいのですが、スキーマビルダーの復習も兼ねています。

//delte_atカラムの追加
 Route::get('collections/table/add/deleted',function(){
 //deleted_atカラムの存在確認
 if(!Schema::hasColumn('collections','deleted_at')){
 // collectionsテーブルの更新
 Schema::table('collections',function($table){
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
 return 'deleted_atを追加しました。';
 }else{
 return '処理を中止します。';
 }
 });
  • 8行目:deleted_atカラムは、必ず、NULL値の入力を許可します。このnullableメソッドで、NULL値の許可をしなければ、ソフトデリートの機能が使えませんので注意して下さい。

ブラウザで下記のURLにアクセスします。

http://localhost/laravel4/public/collections/table/add/deleted

「deleted_atを追加しました。」と表示されたら、無事カラムが追加されています。

モデルにソフトデリートの設定

次にモデルにソフトデリートを許可するために下記のように修正します。

<?php
 class Collection extends Eloquent{
 //複数代入可能な属性を定義する
 protected $fillable=array('code','title','category','content');
 //ソフトデリートの設定
 protected $softDelete=true;
 }
  • 6行目のコードを追加します。

削除用ルーター

それでは、 削除用のルーターを下記のように作成します。

/******************************************
*
* データの削除
*
* getでデータ削除用ページの表示
* postでバリデーション及びデータの削除
*
******************************************/

Route::get('collection/delete/{id}',function($id){
$data['collection']=Collection::find($id);
return View::make('collection/delete',$data);
});

Route::post('collection/delete/{id}',array('before'=>'csrf',function($id){
$collection=Collection::find($id);
$collection->delete();
return Redirect::to('collection');
}));
  • 15行目:必ず、csrfフィルターは通すようにしましょう。貴重なデータを守るためにはソフトデリートの設定だけではなく、2重3重の安全策は講ずるべきです。

 削除用のビュー

データ削除用のビューを下記のように作成します。

app/views/collection/delete.blade.php
@extends('layouts.hpb')
 @section('content')
 <!-- wrapper -->
 <div id="hpb-wrapper">
 <div id="hpb-main">
 <h4 style="color:red">このデータを削除してもよろしいですか</h4>
 <table border="1" width="95%" cellspacing="0" cellpadding="2" id="HPB_TABLE_2_A_130515164035" class="hpb-cnt-tb1">
 <tbody>
 <tr>
 <th class="hpb-cnt-tb-th1" width="93">&nbsp;id</th>
 <th class="hpb-cnt-tb-th1" width="415">&nbsp;{{ $collection->id }}</th>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell2" width="93">&nbsp;タイトル</td>
 <td class="hpb-cnt-tb-cell2" width="415">&nbsp;{{ $collection->title }}</td>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell1" width="93">&nbsp;コード</td>
 <td class="hpb-cnt-tb-cell1" width="415">&nbsp;{{ $collection->code }}</td>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell2" width="93">&nbsp;カテゴリ</td>
 <td class="hpb-cnt-tb-cell2" width="415">&nbsp;{{ $collection->category }}</td>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell1" width="93">&nbsp;コンテンツ</td>
 <td class="hpb-cnt-tb-cell1" width="415">&nbsp;{{ $collection->content }}</td>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell2" width="93">&nbsp;作成日</td>
 <td class="hpb-cnt-tb-cell2" width="415">&nbsp;{{ $collection->created_at }}</td>
 </tr>
 <tr>
 <td class="hpb-cnt-tb-cell1" width="93">&nbsp;更新日</td>
 <td class="hpb-cnt-tb-cell1" width="415">&nbsp;{{ $collection->updated_at }}</td>
 </tr>
 </tbody>
 </table>
 {{ Form::open() }}
 {{ Form::submit('削除',array('class'=>'btn btn-danger span6')) }}
 {{ Form::token() }}
 {{ Form::close() }}
 <br>
 <div id="pagetop"><a href="#hpb-container">このページの先頭へ</a></div>
 </div>
 <!-- main end -->
 </div>
 <!-- wrapper end -->
 @stop
  • テーブル全体をフォームで囲っても構わないのですが、送信するデータは、トークンデータのみですので、フォームはトークンとSubmitボタンだけを囲んで作成しています。

ブラウザで確認してみます。詳細ページから削除ボタンをクリックすると、削除用のページへ移動します。

laravel4_079

削除データを確認したら、削除ボタンをクリックします。トップページ(一覧ページ)へ移動して、一覧から今削除ボタンを押したデータは消えています。phpMyAdminで確認してみましょう。

laravel4_080

先ほど削除ボタンを押したデータのdeleted_atに日付データが入力されています。このようにLaravel4のソフトデリートでは、deleted_atカラムに日付が入力されたデータ(実際は、NULL値以外のデータ)は、普通の検索では表示されません。

これで、間違ってデータを削除しても大丈夫ですね。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です