🗑️ 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.phpdosyası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ğislug’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_atsü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! ☁️