Laravelで論理削除(ソフトデリート)の実装方法と注意点

ソフトデリートを使いたいテーブルに

deleted_atカラムを作る。

既存のcustomersテーブルに追加するという想定で解説。

php artisan make:migration add_softDeletes_to_customers

<?php
//プロジェクトディレクトリ\database\migrations\2022_11_12_120044_add_soft_deletes_to_customers.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

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

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('customers', function (Blueprint $table) {
            $table->softDeletes();//追記
        });
    }
}

モデルにsoftdeleteを使うことを明言

//customer.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\SoftDeletes;//追記

class Customer extends Model
{
    use SoftDeletes;//追記

//中略
}

後はdelete()メソッドで普通に削除するだけでいい。

削除したらdeleted_atカラムに削除日が入る。

削除日が入ってるだけでレコードが物理削除されたときとほぼ同じ動きになる。

Laravel側が勝手に判定してくれるので、「deleted_atカラムがnullなら」とか条件式を自分で書かなくていい。

復活させるときはonlyTrashed()->where('id',該当ID)->restore()みたいな書き方をする

public function reborn(Request $request,Customer $customer){
       $customer = $customer::onlyTrashed()->where('id',$request->id);
       return $customer->restore();
    }

自力でstatsuってカラムを作って論理削除を実装していた時よりも、動きが速くなった気がする。

https://qiita.com/kuropp/items/b7c6c068a90ec7bdcd73

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事