WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
Blog スタッフブログ
Laravel
システム開発
[Laravel]ソフトデリートでのユニーク制約のかけかた
システム開発担当のTFです。
関連
※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');
}
};