はじめに
一般的な削除である物理削除ではなく、今回は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', 'サブスクリプションがキャンセルされました。');
}
以上。