laravel 5.5のソフトデリートと削除済みのデータを取得する方法

例えば、マスターデータなどを削除する場合は、連携している過去のデータとの整合性が取れなくなるので、ソフトデリートをする場合が多々あります。
ログを残す意味でも使用する方もいますが、私は特に個人情報に繋がりそうなデータはできるだけ持ちたくないので、普通のデリートとソフトデリートを使い分けしています。
Laravelではそれらを簡単に実現でき、ソフトデリートで削除したデータも必要な時だけ取得できます。
ソフトデリートとは?
そもそも、ソフトデリートを知らない方に少し説明します。
こちらのサイトがわかりやすいので引用します。
データベースに保存されているデータ(レコード)を完全に削除してしまう「物理削除」と、実際にはデータは削除せず、フラグを立てて削除したように振る舞う「論理削除」があり、ソフトデリートは後者を表します。
要は、パソコンで言うところのゴミ箱に入っている状態で、復元することができます。
ソフトデリートに対応する
さて、ソフトデリートに対応するには、モデルとマイグレーションファイルを変更します。
詳細はこちらに全部書いてあります。
Eloquent:利用の開始 5.5 Laravel
モデルの変更
Usersモデルを例に挙げて紹介します。
ココでのポイントは以下の3行を追加することです。
- 先頭でSoftDeletesを読み込みます
-
use Illuminate\Database\Eloquent\SoftDeletes;
- クラスの中でSoftDeletesを使います宣言
-
use SoftDeletes;
- 削除したら自動で削除日付を入れます
-
protected $dates = ['deleted_at'];
完成するとこのようなります。
app\Users.php
<?php
namespace App;
...
use Illuminate\Database\Eloquent\SoftDeletes;
class Users extends Model
{
use SoftDeletes;
...
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['deleted_at'];
}
マイグレーションの変更
次にマイグレーションファイルのSchema::create()の最後にソフトデリート用の関数を追加します。
database\migrations\2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
...
$table->softDeletes();
});
後はいつも通り、
php artisan migrate
削除済みのデータを取得
念のため、3パターンのデータ取得方法を紹介しておきます。
- 削除済みのデータを含めない(通常)
$users = App\Users::whereNotNull('id')->get();
- 削除済みのデータも含める
$users = App\Users::withTrashed()->whereNotNull('id')->get();
- 削除済みのデータのみ取得
$users = App\Users::onlyTrashed()->whereNotNull('id')->get();
データの復元・完全削除
最後に、データを戻したい時は、
restore()
完全に削除したい時は、
forceDelete()
を使ってください。
Laravelって本当に便利ですね!
コメント
コメントを投稿