Soft Delete Tuzağı
Laravel’da SoftDeletes özelliğini etkinleştirmek, Eloquent modelinize bir trait eklemek ve migration’ınıza bir deleted_at zaman damgası eklemek kadar basittir. Bu, veri güvenliği açısından büyük bir kazanım gibi görünse de—bir kullanıcı kritik bir projeyi kazara silerse, kolayca geri yükleyebilirsiniz. Ancak, B2B SaaS’ınız büyüdükçe, bu kolaylık hızla mimari bir kâbusa dönüşebilir.
Temel sorun, Unique Constraints ile ilgilidir. Kullanıcının hesabını sildiğini hayal edin; bu, deleted_at değerini günümüz tarihine ayarlamaktadır. Bir ay sonra, tam olarak aynı e-posta adresiyle tekrar kaydolmaya çalıştığında, veritabanınız bir hata verecektir çünkü e-posta hala tablo içinde fiziksel olarak bulunmaktadır ve bu, benzersiz dizini ihlal etmektedir. Artık soft-deleted e-postaları kontrol etmek, geri yüklemek veya veritabanı indekslerinizi tüm platform boyunca benzersiz bir şekilde kapsamlı hale getirmek için karmaşık ve dağınık bir mantık yazmanız gerekecektir.
Çözüm: Durum Makineleri ve Arşivleme
Smart Tech Devs tarafından geliştirilen kurumsal yazılımlarda, “silinmiş” nadiren fiziksel bir durumdur; bu, bir iş durumudur. Her bir veritabanı sorgusunu nasıl etkileyeceklerine dair sihirli bir zaman damgasına güvenmek yerine, açık Durum Makineleri veya Durum sütunları kullanıyoruz.
Sağlam Bir Durum Mimarisi Uygulama
Bir kaydı soft-delete etmek yerine, durumunu archived veya cancelled olarak değiştiriyoruz. Bu, verinin yaşam döngüsünü açık hale getirir ve standard veritabanı kısıtlamalarını tamamen ihlal etmemiş olur.
namespace App\Enums;
enum ProjectStatus: string
{
case DRAFT = 'draft';
case ACTIVE = 'active';
case ARCHIVED = 'archived';
}
Artık Eloquent modelimiz, temel sorguları beklenmedik bir şekilde değiştiren gizli küresel kapsamlar yerine açık kapsamlamalara dayanmaktadır.
namespace App\Models;use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use App\Enums\ProjectStatus;
class Project extends Model { protected $casts = [ 'status' => ProjectStatus::class, ];
/ * Aktif projeleri yalnızca kapsayan bir sorguya scope. */ public function scopeActive(Builder $query): void { $query->where('status', ProjectStatus::ACTIVE); } / * Bir projeyi "kaldırmanın" açık iş mantığı. */ public function archive(): void { $this->update(['status' => ProjectStatus::ARCHIVED]); }}
Büyüklükte Gerçek Silme İşlemleri
Eğer yasal uyumluluk (GDPR gibi) verilerin aktif sistemden *silinmesi gerektiğini* zorunlu kılıyorsa, ancak bir denetim izi gerekiyorsa, özel bir Arşiv Tablosu kullanın. Bir kayıt silindiğinde, bir Olay Dinleyici, o kaydın serileştirilmiş JSON verisini soğuk depolama
audit_logstablosuna taşır ve ardından ana tablodan sert bir fiziksel silme işlemi gerçekleştirir.Sonuç
Soft delete’ler basit bir sorunu çözer, ancak veritabanı indeksleme, yabancı anahtarlar ve benzersiz kısıtlamalar konusunda büyük karmaşıklıklar getirir. Açık durum sütunlarına ve durum makinelerine geçmek, Laravel backend’inizin çok daha öngörülebilir, sorgulanması daha kolay ve sonsuz ölçeklenebilir olmasını sağlar.
Kaynak: Orijinal Makale


