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

laravel-softdeletes
LINEで送る
Pocket

例えば、マスターデータなどを削除する場合は、連携している過去のデータとの整合性が取れなくなるので、ソフトデリートをする場合が多々あります。
ログを残す意味でも使用する方もいますが、私は特に個人情報に繋がりそうなデータはできるだけ持ちたくないので、普通のデリートソフトデリートを使い分けしています。
Laravelではそれらを簡単に実現でき、ソフトデリート削除したデータも必要な時だけ取得できます。

ソフトデリートとは?

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

what 論理削除と物理削除はどっちがいいんだろうね?というお話。 ググってみる ■物理削除と論理削除、どっちがいいの? -データベースを使用したシステ- その他(データベース) | 教えて!goo 結論は、 どちらがBetterかはケースによるので、 その場その場でBetterな方法を選択すればよろしいかと。 ■データベースの論理削除と物理削除 - to-R 理想はケースバイケース(処理ベースではなく案件ベース)で使い分けるのが良いと思うのですが、他のプログラマーさんはどのように書いてるのでしょう? うーん。ケースバイケースなんですかね...

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


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

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

モデルの変更

Usersモデルを例に挙げて紹介します。
ココでのポイントは以下の3行を追加することです。

先頭でSoftDeletesを読み込みます
use IlluminateDatabaseEloquentSoftDeletes;
クラスの中でSoftDeletesを使います宣言
use SoftDeletes;
削除したら自動で削除日付を入れます
protected $dates = ['deleted_at'];

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

appUsers.php

<?php

namespace App;

...
use IlluminateDatabaseEloquentSoftDeletes;

class Users extends Model
{
    use SoftDeletes;

    ...

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

マイグレーションの変更

次にマイグレーションファイルのSchema::create()の最後にソフトデリート用の関数を追加します。

databasemigrations2014_10_12_000000_create_users_table.php

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

後はいつも通り、

php artisan migrate

削除済みのデータを取得

念のため、3パターンのデータ取得方法を紹介しておきます。

削除済みのデータを含めない(通常)
$users = AppUsers::whereNotNull('id')->get();
削除済みのデータも含める
$users = AppUsers::withTrashed()->whereNotNull('id')->get();
削除済みのデータのみ取得
$users = AppUsers::onlyTrashed()->whereNotNull('id')->get();

データの復元・完全削除

最後に、データを戻したい時は、

restore()

完全に削除したい時は、

forceDelete()

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

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket


コメントを残す

Amazon プライム対象