こんにちは、後藤です。
PCを操作していて、削除ボタンを押す場面は多くあるのですが、削除ボタンを押すのは勇気がいりますよね。
削除=完全に消し去ること(怖い)
こんなイメージが強かったのですが、どうやら削除にも種類があるみたいです。
どちらを使用するかは要件によりますが、削除データの復元が必要な場合や、何らかの理由でデータを保持したい場合には論理削除を使用します。物理削除は完全にデータをデータベースから削除するので、これらの要件がない場合に適しています。ここでは、それぞれの使用方法について説明します。
論理削除(Soft Delete)
LaravelのEloquent ORMでは、論理削除をサポートするSoftDeletingTraitが用意されています。これを使用すると、データは物理的にはデータベースに残りますが、削除フラグを設定することで削除されたとみなされます。
まずは、マイグレーションで論理削除用のカラムdeleted_at
を追加します。
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
次に、モデルでIlluminate\Database\Eloquent\SoftDeletes
traitを使用します。
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
これで、delete()
メソッドを呼び出してもデータは物理的には削除されず、deleted_at
カラムにタイムスタンプが設定されます。論理削除されたレコードはデフォルトのクエリから除外されます。
$user = User::find(1);
$user->delete(); // 論理削除
論理削除されたレコードを取得するにはwithTrashed()
メソッドを使用します。
$users = User::withTrashed()->get();
物理削除(Hard Delete)
物理削除はデータベースから完全にデータを削除します。Laravelでは、論理削除と同様にdelete()
メソッドを使用します。
$user = User::find(1);
$user->delete(); // 物理削除
ただし、一度物理削除を行うとデータは復元できないので注意が必要です。
また、論理削除されたレコードを物理削除するにはforceDelete()
メソッドを使用します。
$user = User::withTrashed()->find(1);
$user->forceDelete(); // 物理削除
以上がLaravelでの論理削除と物理削除の基本的な使い方です。
まとめ
Laravelには、アプリケーションの要件に応じて選択できる2つの削除方法、論理削除と物理削除があります。
論理削除は、削除されたレコードをデータベースに保持し、必要に応じて復元可能な選択肢です。LaravelではSoftDeletes
traitを利用して簡単に実装でき、deleted_at
カラムに削除した日時を保存します。
一方、物理削除はデータベースからデータを完全に削除します。これはデータの復元が不可能なため、取り扱いには注意が必要です。
ぜひ皆さんも、ウェブアプリケーション作成で活用してみてください!