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