カテゴリ: Laravel 更新日: 2025/12/25

Laravelでソフトデリートを使う方法(SoftDeletes)を完全ガイド!初心者でもわかるEloquent ORM入門

Laravelでソフトデリートを使う方法(SoftDeletes)
Laravelでソフトデリートを使う方法(SoftDeletes)

先生と生徒の会話形式で理解しよう

生徒

「Laravelで削除したデータを後から復活させたいときはどうすればいいんですか?」

先生

「そんなときに便利なのが、Laravelのソフトデリート(SoftDeletes)という仕組みです。」

生徒

「普通の削除とどう違うんですか?」

先生

「ソフトデリートは、データを完全に消すのではなく、削除したとマークするだけなので復活が可能です。具体的な使い方を見ていきましょう!」

1. ソフトデリートとは?

1. ソフトデリートとは?
1. ソフトデリートとは?

通常の削除(ハードデリート)は、データベースから完全にデータを消してしまいます。一度削除すると二度と戻せません。これに対してソフトデリート(SoftDeletes)は、データを消す代わりに「削除された日時」を記録するだけの仕組みです。

つまりデータ自体は残っており、後から「復元」したり「削除済みのデータも含めて取得」したりできます。これはゴミ箱に入れるイメージと考えるとわかりやすいです。ファイルを完全に削除する代わりにゴミ箱に移動させるのと同じ仕組みです。

2. ソフトデリートを使う準備

2. ソフトデリートを使う準備
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. ソフトデリートでデータを削除する

3. ソフトデリートでデータを削除する
3. ソフトデリートでデータを削除する

ソフトデリートを有効にしたモデルでは、delete()を実行するとデータベースから完全に削除されるのではなく、deleted_atに日時が記録されます。


$user = User::find(1);
$user->delete();

idが1のユーザーは削除フラグがつき、データは残ったままになります

4. 削除済みデータを含めて取得する

4. 削除済みデータを含めて取得する
4. 削除済みデータを含めて取得する

通常、ソフトデリートされたデータは自動的にクエリの結果から除外されます。しかし、削除済みも含めて取得したいときはwithTrashed()を使います。


$users = User::withTrashed()->get();

削除済みも含めて全ユーザーを取得します

さらに、削除済みだけを取得したい場合はonlyTrashed()を使います。


$deletedUsers = User::onlyTrashed()->get();

削除済みユーザーのみ取得します

5. データを復元する

5. データを復元する
5. データを復元する

削除済みのデータを復元するにはrestore()を使います。


$user = User::withTrashed()->find(1);
$user->restore();

idが1のユーザーが復元されます

これでdeleted_atが空に戻り、通常のデータとして扱えるようになります。

6. データを完全に削除する(強制削除)

6. データを完全に削除する(強制削除)
6. データを完全に削除する(強制削除)

ソフトデリートされたデータをデータベースから完全に消したい場合は、forceDelete()を使います。


$user = User::withTrashed()->find(1);
$user->forceDelete();

idが1のユーザーが完全に削除されます

この操作をすると、データベースから物理的に削除され、復元はできません。

7. ソフトデリートの活用例

7. ソフトデリートの活用例
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は、こうした実践的な機能が揃っているのが魅力です。」

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelの認証状態をチェックする方法を完全解説!authとAuth::check()を初心者向けにやさしく説明
New2
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New3
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New4
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.7
Java&Spring記事人気No7
Laravel
LaravelでルートをBladeテンプレートに記述する方法(route関数)
No.8
Java&Spring記事人気No8
Laravel
Laravelのルートキャッシュ機能を活用してパフォーマンス改善!初心者でもわかる完全ガイド