サイトアイコン IT NEWS

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

laravel-softdeletes

例えば、マスターデータなどを削除する場合は、連携している過去のデータとの整合性が取れなくなるので、ソフトデリート論理削除)をする場合が多々あります。
Laravelではそれらを簡単に実現でき、ソフトデリート論理削除したデータも必要な時だけ取得できます。

ログを残す意味でも使用する方もいますが、私は特に個人情報に繋がりそうなデータはできるだけ持ちたくないので、普通のデリート物理削除)とソフトデリート論理削除)を使い分けしています。

ソフトデリートとは?

そもそも、ソフトデリート論理削除)を知らない方に少し説明します。
こちらのサイトがわかりやすいので引用します。

データベースに保存されているデータレコード)を完全に削除してしまう「物理削除」と、実際にはデータ削除せず、フラグを立てて削除したように振る舞う「論理削除」があり、ソフトデリートは後者を表します。
要は、パソコンで言うところのゴミ箱に入っている状態で、実際にはデータとして復元取得)することができます。

ソフトデリートに対応する

さて、ソフトデリートに対応するには、モデルマイグレーションファイルを変更します。
詳細はこちらに全部書いてあります。

モデルでSoftDeletesトレイトを使う

ここから、Laravelで予め用意されているUsersモデルを例に挙げて紹介します。
ココでのポイントは以下の3行を追加することです。

1 モデルの先頭でSoftDeletesトレイトを読み込みます。

use Illuminate\Database\Eloquent\SoftDeletes;

クラスの中でSoftDeletesを使います宣言。

use SoftDeletes;

2 ソフトデリートを実行したら、自動で削除日付を入れる設定をします。

protected $dates = ['deleted_at'];

3 完成するとこのようなります。

/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/…_create_users_table.php

Schema::create('users', function (Blueprint $table) {
    ...
    $table->softDeletes();
});

後はいつも通り、

php artisan migrate

削除済みデータの取得

Laravelソフトデートに対応したクエリビルダも用意されていますので、データ取得方法を3パターン紹介しておきます。

1 ソフトデートしたデータを含めない(通常)

$users = \App\Users::whereNotNull('id')->get();

2 ソフトデートしたデータも含める

$users = \App\Users::withTrashed()->whereNotNull('id')->get();

3 ソフトデートしたデータのみ取得

$users = \App\Users::onlyTrashed()->whereNotNull('id')->get();

データの復元・完全削除

最後に、ソフトデートしたデータを削除する前の状態に戻したい場合は、

restore()

ソフトデートしたデータを完全に削除物理削除)したい場合は、

forceDelete()

を使ってください。
Laravelって本当に便利ですね!

モバイルバージョンを終了