Skip to main content

🗑️ Laravel Eloquent ORM: İlişkili Verileri Yöneterek Güvenli Kayıt Silme


💡 Bu Rehberde Ne Öğreneceksiniz

Bu rehberde, Laravel Eloquent ORM’in delete() metodunu kullanarak kayıtları güvenli bir şekilde silmeyi öğreneceksiniz. Ayrıca, bir ana kayıt (örneğin Liste) silinirken ona bağlı alt kayıtların (örneğin Link) kaybolmaması için nasıl toplu güncelleme (update) uygulanacağını ve Soft Delete (yumuşak silme) yönteminin nasıl etkinleştirileceğini göstereceğiz.


⚙️ 1. Yeni Artisan Komutu Oluşturma

Öncelikle özel bir silme komutu oluşturalım.

docker-compose exec app php artisan make:command ListDelete

Bu komut, app/Console/Commands/ListDelete.php dosyasını oluşturur.


🧩 2. Silme Mantığını Uygulama

ListDelete.php dosyasını açın ve silme işlemini yönetecek şekilde düzenleyin:

<?php

namespace App\Console\Commands;

use App\Models\Link;
use App\Models\LinkList;
use Illuminate\Console\Command;

class ListDelete extends Command
{
protected $signature = 'list:delete {list_slug}';
protected $description = 'Listeleri Siler ve Bağlantıları Varsayılana Atar';

public function handle()
{
$list_slug = $this->argument('list_slug');
$list = LinkList::firstWhere('slug', $list_slug);

if ($list === null) {
$this->error("Geçersiz veya var olmayan Liste.");
return 1;
}

if ($this->confirm("'$list->title' listesini silmeyi onaylıyor musunuz? Bağlantılar varsayılana atanacak.")) {
$default_list = LinkList::firstWhere('slug', 'default');

// Varsayılan liste yoksa oluştur
if (!$default_list) {
$default_list = new LinkList();
$default_list->title = 'default';
$default_list->slug = 'default';
$default_list->save();
}

$this->info("Bağlantılar varsayılan listeye atanıyor...");

// Toplu güncelleme işlemi
Link::where('link_list_id', $list->id)
->update(['link_list_id' => $default_list->id]);

// Listeyi sil
$list->delete();
$this->info("Liste Başarıyla Silindi.");
}

return 0;
}
}

Bu kod, silinecek listeyi bulur, ilişkili bağlantıları varsayılan listeye taşır ve ardından listeyi kalıcı olarak siler.


🧠 3. İşlem Akışını Anlamak

  • firstWhere() → Kullanıcının girdiği slug’a göre listeyi bulur.
  • confirm() → Kullanıcıdan onay ister.
  • update() → İlişkili linkleri varsayılan listeye taşır.
  • delete() → Listeyi Eloquent Model üzerinden siler.

Tüm bu işlemler tek bir komutla çalışır.


🧰 4. Komutu Test Etme

Mevcut bağlantıları kontrol etmek için:

docker-compose exec app php artisan link:show

Bir listeyi silmek için:

docker-compose exec app php artisan list:delete digitalocean

Terminal çıktısı:

Confirm deleting the list 'digitalocean'? Links will be reassigned to the default list. (yes/no) [no]:
> y

Reassigning links to default list...
Liste Başarıyla Silindi.

Son durumda, eski “digitalocean” bağlantılarınız default listesine aktarılmış olacaktır.


🔄 5. Soft Delete (Yumuşak Silme) Yöntemini Etkinleştirme

Silinen kayıtların veritabanından tamamen kaldırılmasını istemiyorsanız Soft Delete kullanabilirsiniz.

Model dosyanızda (LinkList.php) aşağıdaki özelliği ekleyin:

use Illuminate\Database\Eloquent\SoftDeletes;

class LinkList extends Model
{
use SoftDeletes;
}

Ardından migration dosyanıza şu satırı ekleyin:

$table->softDeletes();

Migration’ı çalıştırın:

php artisan migrate

Bu sayede kayıtlar tamamen silinmek yerine deleted_at sütunu doldurulur.

Silinmiş kayıtları da sorgulamak için:

LinkList::withTrashed()->get();

Kalıcı olarak silmek isterseniz:

$list->forceDelete();

⚡ 6. Toplu Silme ve Güncelleme Alternatifleri

Tüm kayıtları tek seferde silmek isterseniz:

LinkList::truncate(); // tabloyu tamamen sıfırlar

Belirli koşula göre silmek isterseniz:

Link::where('link_list_id', 5)->delete();

Toplu güncelleme için:

Link::where('status', 'inactive')->update(['status' => 'archived']);

Bu işlemler, model olaylarını (events) tetiklemez ve daha yüksek performans sağlar.


❓ Sıkça Sorulan Sorular (SSS)

1. delete() ve forceDelete() farkı nedir?

delete() soft delete aktifse yalnızca deleted_at alanını günceller. forceDelete() kaydı tamamen siler.

2. Toplu güncelleme neden tercih edilir?

Yüzlerce kaydı tek sorguda değiştirmek performans sağlar. Döngü (foreach) gerektirmez.

3. Soft Delete veriyi nasıl gizler?

Laravel, varsayılan sorgularda deleted_at IS NULL koşulunu ekler. Silinen kayıtlar gizlenir ama kaybolmaz.

4. confirm() ne işe yarar?

Komut satırında kullanıcıdan etkileşimli onay alır.

5. Tüm kayıtları geri getirmek mümkün mü?

Evet. LinkList::onlyTrashed()->restore(); komutuyla Soft Delete’li kayıtları geri yükleyebilirsiniz.


🏁 Sonuç

Artık Laravel Eloquent ORM ile ilişkili verileri koruyarak güvenli silme işlemleri yapabiliyorsunuz. Toplu güncellemeler, Soft Delete ve özel Artisan komutlarıyla veritabanı bütünlüğünü koruyabilir ve veri kaybını önleyebilirsiniz.

💡 Laravel projelerinizi optimize etmek ve güvenle yönetmek için Rabisu Bulut üzerinde hemen bir sanal sunucu oluşturun! ☁️