Laravel Eloquent ile Veritabanı Kayıtları Nasıl Silinir? 🗑️
Laravel'in Eloquent ORM'ini kullanarak veritabanındaki kayıtları silmek oldukça kolaydır. Bu rehberde, Eloquent’in delete yöntemini kullanarak nasıl veritabanı kayıtları sileceğinizi, özellikle listeleri silerken ilişkili öğeleri nasıl yeniden atayacağınızı öğreneceksiniz. Ayrıca, Laravel Artisan komutlarıyla bu işlemi nasıl otomatikleştirebileceğinizi keşfedeceksiniz.
Bu Rehberde Ne Öğreneceksiniz?
Eloquent ORM’de veritabanı kayıtlarını silmek için kullanılacak temel komutları öğrenecek, bir listeyi silerken ilişkili öğeleri nasıl başka bir listeye taşıyacağınızı göreceksiniz. Ayrıca, Laravel Artisan komutlarıyla bu işlemi nasıl otomatikleştirebileceğinizi keşfedeceksiniz.
1. Yeni Artisan Komutu Oluşturma
Öncelikle, listeleri silme işlevini bir Artisan Komutu aracılığıyla otomatikleştirelim. Konteynerize bir ortam kullanıyorsanız, komutu app hizmeti içinde çalıştırmalısınız.
Komut Dosyasını Başlatma:
docker-compose exec app php artisan make:command ListDelete
Laravel'in app/Console/Commands/ListDelete.php dizininde yeni bir komut dosyası oluşturur.
2. ListDelete Komutunu Uygulama
Oluşturduğumuz ListDelete.php dosyasını açıp, silme ve ilişkili kayıtları yeniden atama mantığını ekleyelim.
Komut İmzasını ve Açıklamasını Tanımlama:
$signature değişkeni, komut adını ve zorunlu parametreyi (list_slug) belirler.
handle() Metodunu Yazma:
handle() metodu, komut çalıştığında tetiklenecek ana mantığı içerir.
Dosya İçeriği `(app/Console/Commands/ListDelete.php)````:
Mevcut şablon kodu, aşağıdaki içerikle değiştirilmelidir:
<?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 = 'Veritabanından listeleri siler.';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$list_slug = $this->argument('list_slug');
$list = LinkList::firstWhere('slug', $list_slug);
if ($list === null) {
$this->error("Geçersiz veya bulunamayan liste.");
return 1;
}
if ($this->confirm("'$list->title' listesi silinsin mi? Tüm ilişkili linkler varsayılan listeye atanacak.")) {
$default_list = LinkList::firstWhere('slug', 'default');
if (!$default_list) {
$default_list = new LinkList();
$default_list->title = 'default';
$default_list->slug = 'default';
$default_list->save();
}
$this->info("Linkler varsayılan listeye atanıyor...");
// 🔑 Tüm ilişkili Link'leri bulur ve ID'lerini varsayılana günceller.
Link::where('link_list_id', $list->id)->update(['link_list_id' => $default_list->id]);
// 🔑 Listeyi veritabanından siler.
$list->delete();
$this->info("Liste başarıyla silindi.");
}
return 0;
}
}
Bu kod, listeyi bulur, kullanıcıdan onay ister ve ardından ilişkili kayıtları güncelleyip ana kaydı siler.
3. Silme İşlemini Test Etme
Oluşturduğumuz komutu çalıştırarak test edelim.
Mevcut Linkleri Görüntüleme:
Önce veritabanındaki mevcut listeleri ve linkleri görelim.
docker-compose exec app php artisan link:show
Bu komut, mevcut linklerin hangi listelere ait olduğunu gösterir.
Listeyi Silme Komutunu Çalıştırma:
Örneğin, social slug’ına sahip listeyi silelim.
docker-compose exec app php artisan list:delete social
Onay İstemi:
Komut satırında çıkan onay sorusuna y yazıp ENTER tuşuna basarak işlemi onaylayın.
Confirm deleting the list 'social'? Tüm ilişkili linkler varsayılan listeye atanacak. (yes/no) [no]:
> y
Reassigning links to default list...
Liste başarıyla silindi.
Sonucu Doğrulama:
Linkleri tekrar kontrol ederek social listesindeki linklerin default listesine taşındığını görebilirsiniz.
docker-compose exec app php artisan link:show
Silme işleminden sonra linklerin yeni listesini gösterir. Artık social listesi yerine default listesini göreceksiniz.
Sıkça Sorulan Sorular (SSS)
- Eloquent'te kayıt silmenin kaç yolu vardır?
İki temel yolu vardır: Model örneği üzerinden silme ($kayit->delete()) ve Sorgu üzerinden toplu silme (Model::where('sutun', $deger)->delete()). Birincisi olayları (events) tetikler, ikincisi daha hızlıdır ancak olayları tetiklemez.
- Neden
update()metodu ile toplu güncelleme yaptık?
Doğrudan listeyi silseydik, ilişkili tüm linkler sahipsiz (orphaned) kalırdı. Bu durumu önlemek için, ana kaydı silmeden önce alt kayıtları toplu bir SQL sorgusu ile güvenli bir şekilde başka bir ana kayda atadık.
LinkList::firstWhere('slug', 'default')ne işe yarar?
Bu ifade, LinkList modelinde slug sütununun değeri 'default' olan ilk kaydı bulur. Bu, PHP'de $list->delete() yapmadan önce, silinecek listenin ID'sini elde etmek için kritik bir Eloquent sorgu yöntemidir.
$this->confirm()ne için kullanılır?
Bu, Artisan Komutlarına özgü bir yöntemdir. Kullanıcıdan bir işlemi gerçekleştirmeden önce yazılı onay almayı sağlar. Bu, geri dönüşü olmayan işlemler (silme gibi) için güvenlik katmanı oluşturur.
Sonuç
Bu rehberde, Laravel ile veritabanındaki listeleri nasıl silebileceğinizi, ilişkili öğeleri nasıl başka bir listeye taşıyacağınızı ve bu işlemi Artisan komutları ile nasıl otomatikleştirebileceğinizi öğrendiniz. Artık Laravel projelerinizde bu komutları kullanarak veritabanı yönetim işlemlerinizi kolayca yapabilirsiniz. Rabisu Bulut platformunda Laravel uygulamanız için özel konteynerler oluşturarak geliştirme süreçlerinizi hızlandırabilirsiniz.