Laravel SoftDelete and Foreign Key Cascade

Merhaba, bu yazımda soft delete ve foreign key ile birbirine bağlanan tablolarda cascade kullanımdan bahsedeceğim.

Soft Delete Nedir ?

Delete işlemi veriyi, veri tabanından fiziksel olarak siler. Soft delete işleminde ise, veri yazılımsal olarak silinir. Tabloya deleted_at column’u eklenir. İnsert sırasında null bırakılan column, delete işlemi yapılırken zaman damgasıyla doldurulur. Bu sayede veri silme isteğini zamanıyla birlikte tutmuş oluruz. Deleted_at column dolu olan veri silinmiş sayılır ve sorgulara dahil edilmez.

Laravel’de Soft Delete Kullanımı

Soft Delete özelliği Laravel‘le birlikte gelmektedir. Ekstra kuruluma ihtiyaç duymadan kullanılabilir. Laravel’de Soft Delete Kullanabilmek için migration dosyanızda soft delete column eklemeniz gerekecek. Model dosyanızda ise softDelete Trait‘ini kullanmanız gerekecek.

Schema::create('tests', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('test');
    $table->timestamps();
    $table->softDeletes(); // tablonuza deleted_at column ekler
});
use Illuminate\Database\Eloquent\SoftDeletes;

class Test extends Model
{
    use SoftDeletes; // artık delete işlemleri soft olarak gerçekleşecek.
}
$delete = Test::first();
$delete->delete();

Artık sildiğiniz veriler, veri tabanında tutulacaklar. Eloquent ile işlem yaparken ise silinmiş kabul edilecekler.

Laravel’de Foreign Key Kullanımı

Foreign Key verileri birbirleri ile ilişkilendirmekte kullanılır. Örneğin arac_sinifi ve araclar isimde iki tablo düşünün. Aracın hangi sınıfa ait olduğunu tanımlamak için Foreign Key ile bağlarsınız.

arac_sinifi

idsinif
1Binek
2Ticari
3Kamyonet

araclar

idsinif_idplaka
1101 FTH 01
2101 TF 038
3201 TF 006

Araçlar tablosundaki 1 ve 2’inci araçlar binek sınıfında, 3’üncü araç ise ticari sınıfında yer aittir. Eloquent Model’de iki tabloyu birbirine bağlamak için migration dosyanızda Foreign Key tanımlamanız gerekiyor.

Schema::create('arac_sinifi', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('sinif');
    $table->timestamps();
    $table->softDeletes();
});
Schema::create('araclar', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('sinif_id');
    $table->foreign('sinif_id')->references('id')->on('arac_sinifis');
    $table->string('plaka');
    $table->timestamps();
    $table->softDeletes();
});

Tablolar oluşurken araclar tablosunu arac_sinifi tablosuna Foreign Key ile bağlamış olduk. Sıra geldi modellerde pivot bağlantı oluşturmaya. Pivot bağlantısı araçlardan sınıflara, sınıflardan araçlara erişebilecek. Pivot bağlantıları başka bir yazıda detaylıca ele alacağım. Şimdilik bu kadarı bizim için yeterli olacaktır.

class AracSinifi extends Model
{
    public function araclar(){
        return $this->hasMany(Arac::class, 'sinif_id','id');
    }
}
class Arac extends Model
{
    public function aracSinifi(){
        return $this->hasOne(AracSinifi::class, 'id','sinif_id');
    }
}

Artık tablolar arası erişim sağlayabiliriz. Yani araçlarla işlem yaparken aracın bağlı olduğu sınıfa erişebiliriz, yada tam tersi.

$araclar = Arac::all();
foreach ($araclar as $item) {
    echo $item->plaka . ' => ' . $item->aracSinifi->sinif . "\n";
}

Erkan çıktısı aşağıdaki gibi olacaktır.

01 FTH 01 => Binek
01 TF 038 => Binek
01 TF 006 => Kamyonet

Laravel’de Cascade Kullanımı

Cascade’in iki işlem işin kullanılır, Update ve Delete. Cascade, Foreign Key ile birbirine bağlanmış tablolar arasında referans olarak alınan tabloda yapılan işlemin Foreign Key olan tabloya yansımasını sağlar. Yani Delete Cascade kullanıyorsanız, arac_sinifi tablosundan Binek isimli veriyi sildiğiniz’de araclar tablosundan sinif_id, 1 olan verilerinde silinmesi sağlar. Laravel’de Cascade kullanmak için migration’da Foreign Key oluştururken Cascade tanımlamak yeterli olacaktır.

Schema::create('araclar', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('sinif_id');
    $table->foreign('sinif_id')->references('id')->on('arac_sinifis')->onDelete('cascade');
    $table->string('plaka');
    $table->timestamps();
    $table->softDeletes();
});

Migration dosyanızda Foreign Key‘e onDelete('cascade') eklemiş oldunuz.

php artisan migrate:refresh

Komutunu çalıştırdıktan sonra, arac_sinifi tablosundan bir veri hard olarak sildiğiniz’de sildiğiniz satıra bağlı verilerin araclar tablosundan da silindiğini göreceksiniz. Aynı durum Soft Delete işleminde gerçekleşmeyecektir.

Laravel’de SoftDelete, Cascade Kullanımı

Bu işlemi Laravel paketleri ile yapamadığımızdan, Laravel için geliştirilmiş laravel-soft-cascade kütüphanesini kurmamız gerekecek. Kütüphanenin versiyon numaraları Laravel’in versiyon numaraları ile aynı olacak şekilde hazırlanmış. Kısacası örnekte "^5.8" yazacağım yere siz kullandığınız Laravel sürümünü yazın.
NOT: 6 ve 7 versiyonları destekleniyor.

composer require askedio/laravel-soft-cascade "^5.8"

Composer aracılıyla soft-cascade trait‘ini kurmuş oldunuz. Artık modellerimizde kullanabiliriz. arac_sinifi tablosundan veri silindiğinde işlem yapmak istediğimiz için AracSinifi Modelinde değişiklik yapacağız.

namespace App\Models;

use Askedio\SoftCascade\Traits\SoftCascadeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class AracSinifi extends Model
{
    use SoftDeletes, SoftCascadeTrait;

    protected $softCascade = ['araclar'];

    public function araclar(){
        return $this->hasMany(Arac::class, 'sinif_id','id');
    }
}

İşlemi tamamladınız. Artık cascade özelliği softDelete işlemlerinde de geçerli olacaktır.

$arac = AracSinifi::first();
$arac->delete();

Kodunu işlettiğinizde, Binek araç sınıfı ve sınıfa dahil 01 FTH 01, 01 TF 038 araçlarının softDelete olarak silindiğini göreceksiniz. Umarım işinize yaramıştır.

ilk Yorum

Yorum Ekle

E-posta hesabınız yayımlanmayacak.

Gerçek kişi doğrulaması
80 − = 72