WinRoadのLaravel4初心者講座

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

Winroad徒然草の管理人がお届けします
ソフトデリート

ソフトデリート

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

EloquentORMでは、ソフトデリートという手法でデータの消失を防いでいます。データの削除(DELETE)の項目でも述べましたが、データベースからデータを消去する場合は特に注意が必要です。かといって不必要なデータが多数あると煩雑になってしまいます。

そこで、このソフトデリートでは、普段の検索やデータの一覧では、不必要な(使用頻度の低い?)データは、普通のメソッドでは、検出できないようにしていますので、データを削除したのと同等の効果があります。

たとえば、退社した社員のデータをソフトデリートしておけば、住所録などには、退職した社員のデータは検出(表示)されませんが、いざ必要なときには、そのデータを抽出することができるのです。

この、ソフトデリートを使用するには、二つの設定が必要です。

一つ目は、データベーステーブルにdeleted_atフィールド(カラム)を、timestamp種別で作成します。そのときに、必ず初期値はNULLに指定してください。

二つ目は、モデルのsoftDeleteプロパティをtrueに指定します。

(例)app/models/User.php

class User extends Eloquent{
protected $softDelete = true;
}

たったこれだけで大事なデータを守ることができますので、ソフトデリートはなるべく使用するようにした方がいいと思います。

以下に、ソフトデリートされたデータを扱うためのメソッドを記述しておきます。

withTrashed

ソフトデリートしたモデルも同時に抽出するためには、withTrashedメソッドを使用します。

$users=User::withTrashed()->where(‘role_id’,1)->get();

定義済みの関連づけに対して、withTrashedメソッドを使用することができます。

$user=User::find(1);
$user->posts()->withTrahed()->get();

  • 上記は、PostモデルがUserモデルに対して、belongsToの関係にある場合、ソフトデリートしたPostモデルも含めた抽出を行います。

onlyTrashed

ソフトデリートしたモデルのみを抽出したい場合はonlyTrashedメソッドを使用します。

$users=User::onlyTrashed()->where(‘role_id’,1)->get();

  • 上記では、role_idが1のモデルのうち、ソフトデリートしたモデルのみを抽出します。

restore

ソフトデリートしたモデルを元の状態に戻すためには、restoreメソッドを使用します。※データベーステーブルのdeleted_atフィールド(カラム)をNULLに変更します。

$users=User::withTrashed()->where(‘role_id’,1)->restore();

  • 上記では、ソフトデリートしたrole_idが1のUserをすべて復活させます。

foreceDelete

データベーステーブルから完全に削除したい場合は、foreceDeleteメソッドを使用します。

$users=User::onlyTrashed()->where(‘role_id’,1)->get();
$users->forceDelete();

  • 上記では、role_idが1のユーザーのうち、ソフトデリートされたモデルだけを完全に削除しています。

trashed

指定したモデルのインスタンスがソフトデリートされたものかどうかを判断するには、trashedメソッドを使用します。

$user=User::withTrashed()->where(‘name’,’nakada’)->first();
if($user->trashed()){
$user->restore();
}

Laravel4.2からの変更

Laravel4.2からは、モデルのソフトデリートは、softDeletesプロパティがなくなり、SoftDeleteTraitを使用するようになりました。そして、datesプロパティにdeleted_atカラムを追加してください。

デフォルトのUserモデルにソフトデリートを追加したのが、下記です。

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends Eloquent implements UserInterface, RemindableInterface {

 use UserTrait, RemindableTrait;
 use SoftDeletingTrait;

 protected $table = 'users';

 protected $hidden =['password', 'remember_token'];
 protected $dates = ['delete_at'];

}
  • 7,12,17行目を追加しています。

尚、ソフトデリートの操作自体は、今までと変わりありません。

« »

コメントを残す

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