データベースのレコード削除方法に論理削除という削除方式があります。
Laravelでは論理削除(ソフトデリート)の機能を簡単に実装する仕組みが備わっています。
この記事では論理削除(ソフトデリート)の実装の仕方から、論理削除したデータの取得方法や復元方法なども解説していきます。
論理削除(ソフトデリート)とは
まず論理削除とはどういったものなのでしょうか?
論理削除はレコードを削除する際に物理的にレコードを削除する(この方式を物理削除と言います)のではなく、「該当レコードは削除済み」を意味するカラムを用意しておきます。
このカラムの値を変更することでレコードを削除したものと見なすことを論理削除と言います。
物理削除とは違って、用意した論理削除用のカラムの値を変更しただけでデータベースにレコードは存在しているので、復元も容易に行うことができます。
ソフトデリートを実装してみる
上記の説明ではイマイチ理解がしづらい方もいると思うので、実際にソフトデリートを実装して理解していくのが一番でしょう。
マイグレーションでソフトデリート用のカラムを用意
まずは論理削除(ソフトデリート)用のカラムをマイグレーション作成時に用意していきます。
$ php artisan make:migration create_users_table --create=users
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
laravelではマイグレーションでテーブル作成時に、$table->softDeletes();
を記述するだけでソフトデリート用のdeleted_atカラムを追加してくれます。
マイグレーションを実行して、テーブルを確認してみましょう。
mysql> desc users;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
deleted_atカラムが用意されていることが確認できますね。
モデルで準備
次にソフトデリートを実装したいモデルで準備を行います。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
準備とはいっても、SoftDeletesトレイトをuseしてあげるだけです。
ソフトデリートを実装する
それでは実際にソフトデリートを使っていきましょう。
ソフトデリートを行う
ソフトデリートしたいモデルインスタンスに対してdeleteメソッドを使用するだけです。
User::find(1)->delete();
該当のデータのdeleted_atカラムにdeleteメソッドを実行した時間が挿入されます。
ソフトデリートされているかの確認
確認したいモデルインスタンスに対してtrashedメソッドを使用することで、戻り値としてソフトデリートされている場合、ture、ソフトデリートされていない場合は、falseが返ってきます。
$user->trashed();
ソフトデリート済みのデータを含めて取得する
デフォルトでデータを取得した場合、ソフトデリートしたデータは取得できません。
ソフトデリートしたデータも含めてデータを取得したい場合はwithTrashedメソッドを利用します。
$users = User::withTrashed()->get();
ソフトデリート済みのデータのみ取得する
ソフトデリートしたデータのみを取得したい場面もあるかと思います。
その場合は、onlyTrashedメソッドを使用します。
$users = User::onlyTrashed()->get();
ソフトデリートからの復元
$user->restore();
ソフトデリートから完全削除
ソフトデリートではなく、データそのものを完全削除(物理削除)したい場合は、forceDeleteメソッドを使用します。
$user->forceDelete();
まとめ
論理削除はWebシステム開発では利用する機会は多いです。
Laravelでは紹介したように簡単に論理削除を利用することができるので、ぜひ参考にしてくださいね。