Laravelでソフトデリートを使う方法(SoftDeletes)を完全ガイド!初心者でもわかるEloquent ORM入門
生徒
「Laravelで削除したデータを後から復活させたいときはどうすればいいんですか?」
先生
「そんなときに便利なのが、Laravelのソフトデリート(SoftDeletes)という仕組みです。」
生徒
「普通の削除とどう違うんですか?」
先生
「ソフトデリートは、データを完全に消すのではなく、削除したとマークするだけなので復活が可能です。具体的な使い方を見ていきましょう!」
1. ソフトデリートとは?
通常の削除(ハードデリート)は、データベースから完全にデータを消してしまいます。一度削除すると二度と戻せません。これに対してソフトデリート(SoftDeletes)は、データを消す代わりに「削除された日時」を記録するだけの仕組みです。
つまりデータ自体は残っており、後から「復元」したり「削除済みのデータも含めて取得」したりできます。これはゴミ箱に入れるイメージと考えるとわかりやすいです。ファイルを完全に削除する代わりにゴミ箱に移動させるのと同じ仕組みです。
2. ソフトデリートを使う準備
ソフトデリートを使うには、モデルとマイグレーションに設定を追加する必要があります。
2-1. マイグレーションにdeleted_atを追加
まずは、テーブルにdeleted_atというカラムを追加します。これは削除した日時を記録するためのカラムです。
$table->softDeletes();
このようにマイグレーションに書くと、自動的にdeleted_atカラムが作成されます。
2-2. モデルにSoftDeletesを追加
次に、対象のモデルにSoftDeletesトレイトを追加します。
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
これで、Userモデルにソフトデリート機能が追加されました。
3. ソフトデリートでデータを削除する
ソフトデリートを有効にしたモデルでは、delete()を実行するとデータベースから完全に削除されるのではなく、deleted_atに日時が記録されます。
$user = User::find(1);
$user->delete();
idが1のユーザーは削除フラグがつき、データは残ったままになります
4. 削除済みデータを含めて取得する
通常、ソフトデリートされたデータは自動的にクエリの結果から除外されます。しかし、削除済みも含めて取得したいときはwithTrashed()を使います。
$users = User::withTrashed()->get();
削除済みも含めて全ユーザーを取得します
さらに、削除済みだけを取得したい場合はonlyTrashed()を使います。
$deletedUsers = User::onlyTrashed()->get();
削除済みユーザーのみ取得します
5. データを復元する
削除済みのデータを復元するにはrestore()を使います。
$user = User::withTrashed()->find(1);
$user->restore();
idが1のユーザーが復元されます
これでdeleted_atが空に戻り、通常のデータとして扱えるようになります。
6. データを完全に削除する(強制削除)
ソフトデリートされたデータをデータベースから完全に消したい場合は、forceDelete()を使います。
$user = User::withTrashed()->find(1);
$user->forceDelete();
idが1のユーザーが完全に削除されます
この操作をすると、データベースから物理的に削除され、復元はできません。
7. ソフトデリートの活用例
ソフトデリートは実際のシステム開発でもよく使われます。例えば次のようなケースです。
- ユーザーが退会したときにデータを消さずに残しておき、問い合わせがあれば復元できるようにする
- ECサイトで商品を一時的に非公開にするときに使う
- 誤って削除してしまったデータを復元できるようにする安全策として活用
初心者でも覚えておくと安心してデータ操作ができるようになります。
まとめ
ソフトデリートの考え方と基本を振り返る
ここまで、Laravelにおけるソフトデリート(SoftDeletes)の仕組みと使い方について、基礎から順番に見てきました。ソフトデリートは、データベースからレコードを完全に削除するのではなく、「削除された」という状態を持たせることで、安全にデータ管理を行うための仕組みです。通常の削除では一度消えたデータは元に戻せませんが、ソフトデリートを使えば、誤操作や想定外の削除が起きても復元できる余地が残ります。
Laravelでは、deleted_atカラムとSoftDeletesトレイトを使うだけで、この仕組みを簡単に導入できます。特別なSQLを書く必要はなく、Eloquent ORMの機能として自然に扱える点が大きな特徴です。削除、取得、復元、完全削除といった操作も、メソッド名が分かりやすく、初心者でも直感的に理解しやすい設計になっています。
特に重要なのは、「削除=完全に消える」という考え方を少し見直すことです。ユーザー管理や商品管理など、後から参照する可能性があるデータについては、すぐに消してしまうよりも、ソフトデリートで一度残しておく方が安心です。実際のWebアプリケーション開発では、こうした安全設計がトラブルを防ぐ大きなポイントになります。
取得・復元・完全削除の使い分け
ソフトデリートを有効にしたモデルでは、通常のget()やfind()では削除済みデータは自動的に除外されます。これは「削除されたデータは普段は見せない」という考え方に基づいています。一方で、管理画面などでは削除済みも含めて確認したい場面が出てきます。そのようなときに使うのがwithTrashed()やonlyTrashed()です。
また、削除したデータを元に戻したい場合はrestore()を使います。これはソフトデリートならではの機能で、deleted_atを空に戻すだけで、通常のデータとして再び扱えるようになります。一方で、データを完全に消したい場合はforceDelete()を使います。この操作は元に戻せないため、本当に不要なデータかどうかを確認したうえで実行する必要があります。
まとめとしての基本サンプル
最後に、ソフトデリートの基本操作をまとめたシンプルな例を確認しておきましょう。これらを押さえておけば、Laravelでのデータ削除処理に迷うことは少なくなります。
// ソフトデリート
$user = User::find(1);
$user->delete();
// 削除済みも含めて取得
$users = User::withTrashed()->get();
// 削除済みのみ取得
$deletedUsers = User::onlyTrashed()->get();
// 復元
$user = User::withTrashed()->find(1);
$user->restore();
// 完全削除
$user->forceDelete();
このように、同じモデルに対して削除、取得、復元、完全削除を柔軟に使い分けられるのが、Eloquent ORMとソフトデリートの強みです。データを安全に扱う意識を持つことで、アプリケーション全体の品質も自然と高まります。
生徒
「削除って聞くと、完全に消えるイメージがありましたが、ソフトデリートなら安心して操作できますね。」
先生
「そうですね。実務では、間違って消してしまうリスクを減らすことがとても大切です。」
生徒
「restore()で元に戻せるのは、本当に便利だと思いました。」
先生
「その感覚は大事ですよ。まずは安全に残しておいて、必要に応じて完全削除する、という考え方が基本です。」
生徒
「これでユーザー管理や商品管理も安心して実装できそうです。」
先生
「ぜひ活用してください。LaravelのORMは、こうした実践的な機能が揃っているのが魅力です。」