例えば、マスターデータなどを削除する場合は、連携している過去のデータとの整合性が取れなくなるので、ソフトデリート(論理削除)をする場合が多々あります。
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って本当に便利ですね!
- Original:https://minory.org/laravel-softdeletes.html
- Source:Minory
- Author:管理者