Laravel Eloquent ile Veritabanına Yeni Kayıtlar Nasıl Eklenir? 💾
Laravel Eloquent, ilişkisel veritabanı işlemlerini kolaylaştıran güçlü bir araçtır. Bu rehberde, Eloquent ile nasıl yeni veritabanı kayıtları ekleyeceğinizi ve ilişkisel verileri nasıl yöneteceğinizi öğreneceksiniz.
Bu Rehberde Ne Öğreneceksiniz?
Laravel Eloquent ORM kullanarak veritabanına yeni kayıt ekleme işlemini nasıl gerçekleştireceğinizi öğreneceksiniz. Ayrıca, yeni kayıtların ilişkili verileriyle birlikte kaydedilmesini sağlayan bir Artisan komutunu nasıl oluşturacağınızı ve mevcut komutları nasıl güncelleyeceğinizi keşfedeceksiniz.
1. Link Ekleme Komutunu (LinkNew) Güncelleme
Yeni linklerin bir listeye bağlı olması gerektiği için, mevcut LinkNew Artisan komutunu güncellememiz gerekiyor.
Komut Dosyasını Açma:
docker-compose exec app nano app/Console/Commands/LinkNew.php
Bu komut, link ekleme mantığını içeren dosyayı düzenlemek için açacaktır.
handle() Metodunu Değiştirme:
Link URL'si ve açıklamasından sonra, kullanıcıya bir liste adı sorulmalı ve bu adla ilgili liste bulunmalı veya oluşturulmalıdır.
<?php
namespace App\Console\Commands;
use App\Models\Link;
use App\Models\LinkList; // 🔑 Yeni: LinkList modelini dahil eder
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class LinkNew extends Command
{
// ... (diger kisimlar)
public function handle()
{
$url = $this->ask('Link URL');
if (!filter_var($url, FILTER_VALIDATE_URL)) {
$this->error("Geçersiz URL. Çıkılıyor...");
return 1;
}
$description = $this->ask('Link Açıklaması');
// 🔑 Kullanıcıdan liste adı ister, boş bırakılırsa 'default' kullanılır
$list_name = $this->ask('Link Listesi (Varsayılan için boş bırakın)') ?? "default";
$this->info("Yeni Link Özeti:");
$this->info($url . ' - ' . $description);
$this->info("Listeleneceği yer: " . $list_name);
if ($this->confirm('Bu bilgiler doğru mu?')) {
// 🔑 LinkList modelini kullanarak liste kaydını bulur veya oluşturur
$list = LinkList::firstWhere('slug', $list_name);
if (!$list) {
$list = new LinkList();
$list->title = $list_name;
$list->slug = $list_name;
$list->save();
}
$link = new Link();
$link->url = $url;
$link->description = $description;
// 🔑 Yeni linki, LinkList modelinin ilişki metodu üzerinden kaydeder
$list->links()->save($link);
$this->info("Kaydedildi.");
}
return 0;
}
}
Bu kod, önce yeni listeyi bulur/oluşturur, ardından linki ilişkisel links()->save() metodu ile listeye bağlayarak kaydeder.
2. Link Gösterim Komutunu (LinkShow) Güncelleme
Linkleri listelerken, hangi listeye ait olduklarını da görebilmek için LinkShow komutunu güncelleyelim.
Komut Dosyasını Açma:
docker-compose exec app nano app/Console/Commands/LinkShow.php
Linkleri tablo halinde gösteren dosyayı açar.
handle() Metodunu Değiştirme:
Sorguda sadece sütun isimlerini çekmek yerine, tüm Eloquent koleksiyonunu almalıyız. Böylece ilişkisel verilere ($link->link_list->slug) erişebiliriz.
public function handle()
{
// 🔑 Yeni 'list' sütun başlığını ekler
$headers = [ 'id', 'url', 'list', 'description' ];
// 🔑 Tüm link kayıtlarını Eloquent koleksiyonu olarak çeker
$links = Link::all();
$table_rows = [];
foreach ($links as $link) {
// 🔑 Link koleksiyonunu döngü ile çevirir
$table_rows[] = [
$link->id,
$link->url,
// 🔑 İlişkisel modele (LinkList) slug alanı üzerinden erişir
$link->link_list->slug,
$link->description
];
}
$this->table($headers, $table_rows);
return 0;
}
Bu kod, linkin ait olduğu listenin slug değerini alıp tabloya ekleyerek çıktıyı zenginleştirir.
3. Yeni Kayıt Ekleme İşlemini Test Etme
Güncellediğimiz link:new komutunu kullanarak veritabanına yeni bir kayıt ekleyelim.
Link Ekleme:
docker-compose exec app php artisan link:new
Komutu çalıştırın ve soruları yanıtlayın: URL, açıklama ve liste adı (örneğin: rabisu_bilgi).
Kayıtları Kontrol Etme:
Eklediğiniz kaydın, ait olduğu liste bilgisiyle birlikte listelendiğini doğrulayın.
docker-compose exec app php artisan link:show
Yeni eklenen linkin, girdiğiniz liste adıyla beraber tabloda göründüğünü kontrol eder.
Sıkça Sorulan Sorular (SSS)
save()ve İlişkiselsave()Metotları Arasındaki Fark Nedir?
Temel $model->save() metodu, mevcut model kaydını doğrudan veritabanına yazar. İlişkisel save() ($parent->children()->save($child)) ise, ilişkili modelin anahtarını (foreign key) otomatik olarak ayarlayıp kaydı gerçekleştirir.
firstWhere('slug', $list_name)ne yapar?
Bu yöntem, LinkList modelinde slug sütunu verilen $list_name değerine eşit olan ilk kaydı bulur. Bu, koşullu sorgu yazmanın kısa ve okunaklı bir yoludur.
Link::all()->toArray()kullanmaktan neden kaçındık?
toArray() metodu kullanıldığında, Eloquent'in ilişkisel bağlantıları ($link->link_list) kaybolur. İlişkili verilere erişebilmek için tüm Eloquent nesnelerini çekip (Link::all()) döngü içinde ilişkilere erişmek gerekir.
handle()metodundaki return 1 ne anlama gelir?
Artisan komutlarında 0 başarılı çıktıyı, 1 (veya sıfır olmayan herhangi bir değer) ise bir hata ile çıkıldığını işaret eder. Bu, betik dilinde çalışan uygulamalar için standart bir kuraldır.
Sonuç
Artık Laravel Eloquent ile bire-çok ilişkilerinde güvenli bir şekilde veri girişi yapabiliyorsunuz. Komut satırı araçlarınızı bu şekilde zenginleştirmek, geliştirme sürecinizi hızlandırır. Bu araçları Rabisu Bulut sanal sunucu örneklerinde hemen kullanmaya başlayabilirsiniz.