3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelで論理削除を実装してみる

Posted at

はじめに

一般的な削除である物理削除ではなく、今回はDBに残しながらも削除扱いとなる論理削除(SoftDelete)を実装していく。
物理削除してしまうと貴重なデータが完全に消えてしまうが、論理削除だと必要なコマンドを打てば取り出すことができるため分析時に役に立つ。

論理削除の手順

①マイグレーションファイルを修正し、deleted_atカラムを追加する

下記コマンドでマイグレーションファイルが新たに作成される。

php artisan make:migration add_deleted_at_to_subscriptions_table --table=subscriptions

作成されたマイグレーションファイルを開き、下記のように加筆する。
nullable()はnullを許容しているため、必ず登録する必要がない場合はつけてあげる。

public function up()
{
    Schema::table('subscriptions', function (Blueprint $table) {
        $table->softDeletes()->nullable();
    });
}

public function down()
{
    Schema::table('subscriptions', function (Blueprint $table) {
        $table->dropSoftDeletes();
    });
}

マイグレーションの実行をする。

php artisan migrate

Modelファイルを修正する

論理削除が適応されるように、SoftDeletesトレイトを使用できるようにする。

<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; // 追記

class Subscription extends Model
{
    use HasFactory;
    use SoftDeletes; // 追記
}

Controllerの削除処理を修正

論理削除を実装するため、deleted_atに現在の日時を登録させる。

public function cancelSubscription(): RedirectResponse
{
    $user = Auth::user();
    if ($user->subscribed('default')) {
        $user->subscription('default')->cancelNow();

        // 該当するレコードをsubscriptionsテーブルから論理削除
        DB::table('subscriptions')->where('user_id', $user->id)->update(['deleted_at' => now()]);

    }
    return redirect()->route('subscriptions.create')->with('message', 'サブスクリプションがキャンセルされました。');
}

以上。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?