Laravel 物理削除と論理削除のコード

php artisan make:migration add_deleted_at_to_spendings_table --table=spendings

上記をコマンドプロンプトで実行するとspendingsというテーブルに追加する

マイグレーションが作成日時の名前で追加される(deleted_atカラムの記述用)

<?php

use Illuminate\\Database\\Migrations\\Migration;
use Illuminate\\Database\\Schema\\Blueprint;
use Illuminate\\Support\\Facades\\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('spendings', function (Blueprint $table) {
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('spendings', function (Blueprint $table) {
            $table->dropSoftDeletes();
        });
    }
};

マイグレーションにこのように記述していく

C:\MAMP\htdocs\Laravel_Sample> php artisan migrate 上記をコマンドプロンプトで実行すると spendingsというテーブルにdeleted_atが追加され、論理削除用の関数が使用可能になる

// 対象を削除してリダイレクトする
    public function deleteSpend(int $id){
        $instance = new Spending;
        $record = $instance->find($id);

        // forceDeleteで物理削除
        $record->forceDelete();

        return redirect('/');;
    }
    
    // 対象を削除してリダイレクトする
    public function SoftDeleteSpend(int $id){
        $instance = new Spending;
        $record = $instance->find($id);

        // deleteで論理削除
        $record->delete();

        return redirect('/');;
    }

あとは、物理削除と論理削除によって上記の2つのコードを使い分けて実装するだけ

delete();が論理削除に変更され、物理削除はforceDelete();になる

// データ物理削除ページ
Route::post('/delete_spend/{id}', [RegistrationController::class, 'deleteSpend'])->name('delete.spend');

// データ論理削除ページ
Route::post('/soft_delete_spend/{id}', [RegistrationController::class, 'SoftDeleteSpend'])->name('softdelete.spend');

ルートを物理、論理削除分追加する

<div class="d-flex justify-content-center mt-3">
    <div class="col-md-4 text-center mb-3">
        <form action="{{ route('delete.spend', ['id' => $spend['id']]) }}" method="POST">
            @csrf
            <button type="submit" class="btn btn-danger">削除</button>
        </form>
    </div>
    <div class="col-md-4 text-center mb-3">
        <a href="{{ route('edit.spend', ['id' => $spend['id']]) }}">
            <button class="btn btn-secondary">編集</button>
        </a>
    </div>
    <div class="col-md-4 text-center mb-3">
    <form action="{{ route('softdelete.spend', ['id' => $spend['id']]) }}" method="POST">
            @csrf
            <button type="submit" class="btn btn-warning">論理削除</button>
        </form>
    </div>
</div>

あとはフォーム内にボタンを配置すればOK