PHP/Laravel プログラミング

Laravelで論理削除(ソフトデリート)を実装してみる

投稿日:

データベースのレコード削除方法に論理削除という削除方式があります。

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では紹介したように簡単に論理削除を利用することができるので、ぜひ参考にしてくださいね。

-PHP/Laravel, プログラミング

Copyright© みぎさんドットコム , 2022 All Rights Reserved Powered by STINGER.