Blog スタッフブログ

Laravel システム開発

[Laravel]ソフトデリートでのユニーク制約のかけかた

システム開発担当のTFです。

関連

[Laravel]リレーションに対応したソフトデリート

※Laravel10系統対応

やり方

  • ソフトデリートの削除状態のdeleted_atによって変化するexistカラムを作成する
  • ユニークをかけたいカラムと、さきほど作成したexistカラムとで複合ユニーク制約とする

メモ

ソフトデリート上の通常のユニーク制約だと、削除かけてもデータは残りdeleted_atに時間が入るのみの為、削除データと同一値を生成できない。
この複合ユニークなら、削除されたデータと同一値も作成できるようになる

参考

  【Laravel】論理削除とユニーク制約を両立させる【MySQLとMariaDB】

サンプル

<?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::create('tests', function (Blueprint $table) {
            $table->id();
			
			$table->string('email');

            $table->timestamps();
			
			// 論理削除
            $table->softDeletes();
			
			// 論理削除されていれば NULL, されていなければ 1 になる生成列を定義
            $table->boolean('exist')->nullable()->storedAs('case when deleted_at is null then 1 else null end');

            // 複合ユニーク制約
            $table->unique(['email', 'exist']);
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('tests');
    }
};