Laravel Eloquent ile Bire-Çok İlişkisi Nasıl Oluşturulur? 🔗
Bu rehberde, Laravel Eloquent ORM kullanarak veritabanınızda bir liste ile bu listeye ait linkler arasında bire-çok ilişkisi nasıl oluşturulacağını öğreneceksiniz. Ayrıca, bu ilişkileri veritabanında nasıl yönetebileceğinizi ve linklerinizi listelere nasıl bağlayabileceğinizi keşfedeceksiniz.
Bu Rehberde Ne Öğreneceksiniz?
Laravel Eloquent ORM'deki bir liste (LinkList) ile linkler (Link) arasında bire-çok ilişkisi kurmayı öğreneceksiniz. İlişkisel veri yönetimi, yeni model ve migration dosyaları oluşturma, ve Eloquent ilişkileri ile çalışma adımlarını takip edeceksiniz.
1. LinkList Modelini Oluşturma ve Komutu Düzenleme
Linkleri gruplayacağımız Liste yapısını temsil eden yeni bir Eloquent Modeli oluşturmalıyız.
Yeni Modeli Başlatma:
Proje dizininde şu komutla yeni bir model oluşturun:
docker-compose exec app php artisan make:model LinkList
Bu komut, app/Models/LinkList.php dosyasını oluşturacaktır. PHP'de List kelimesi ayrılmış olduğundan, LinkList ismi kullanılır.
Mevcut Komutu Yeniden Adlandırma:
Proje dizinindeki app/Console/Commands/LinkList.php dosyasını fark ettiğinizde, bu dosya CLI komutları içeriyor. Bu sınıf, veritabanındaki linkleri listelemekte kullanılıyor.
Komutun adını değiştirmek için şu komutu çalıştırın:
mv app/Console/Commands/LinkList.php app/Console/Commands/LinkShow.php
Sonrasında, dosyayı açarak sınıf adını LinkList'ten LinkShow'ya değiştirin. Komut imzasını da güncelleyerek yeni komutu şu şekilde tanımlayın:
<?php
namespace App\Console\Commands;
use App\Models\Link;
use Illuminate\Console\Command;
class LinkShow extends Command
{
protected $signature = 'link:show';
protected $description = 'Veritabanındaki linkleri listele';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$headers = ['id', 'url', 'description'];
$links = Link::all(['id', 'url', 'description'])->toArray();
$this->table($headers, $links);
return 0;
}
}
Bu değişiklikle, artık link:show komutunu çalıştırarak linklerin listesini görebileceksiniz.
2. Veritabanı Göçlerini (Migrations) Hazırlama
İlişkiyi kurmak için iki tabloda da gerekli yapısal değişiklikleri yapmalıyız.
LinkList Tablosu Göçünü Oluşturma:
Yeni LinkList modeli için bir göç dosyası oluşturun:
docker-compose exec app php artisan make:migration create_link_lists_table
LinkList Göç Dosyasını Düzenleme:
Oluşturulan yeni göç dosyasını açarak liste tablosunun sütunlarını tanımlayın:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLinkListsTable extends Migration
{
public function up()
{
Schema::create('link_lists', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('title', 60);
$table->string('slug', 60)->unique();
$table->text('description')->nullable();
});
}
public function down()
{
Schema::dropIfExists('link_lists');
}
}
Mevcut Linkler Göçünü Güncelleme:
Mevcut create_links_table.php göç dosyasını açarak Bire-Çok ilişkisinin yabancı anahtarını ekleyin. "Çok" tarafı (Linkler) anahtarı tutar.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\LinkList;
class CreateLinksTable extends Migration
{
public function up()
{
Schema::create('links', function (Blueprint $table) {
$table->id();
$table->string('url', 200);
$table->text('description');
$table->foreignIdFor(LinkList::class); // 🔑 İlişkili listeyi ekler
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('links');
}
}
Veritabanını Güncelleme:
Veritabanını temizleyip göçleri yeniden çalıştırın:
docker-compose exec app php artisan db:wipe
docker-compose exec app php artisan migrate
3. Eloquent Model İlişkilerini Tanımlama
Tablolar hazırlandıktan sonra, modeller arasında ilişkiyi tanımlayarak Eloquent'in gücünü kullanalım.
LinkList Modeli (Bire Tarafı) İlişkisi:
app/Models/LinkList.php dosyasını açarak Link modeline ait birden çok kaydı döndüren metodu ekleyin:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class LinkList extends Model
{
use HasFactory;
public function links()
{
// 🔑 Bir listenin birden çok linki olabilir
return $this->hasMany(Link::class);
}
}
Link Modeli (Çok Tarafı) İlişkisi:
app/Models/Link.php dosyasını açarak linkin ait olduğu tek bir listeyi döndüren metodu ekleyin:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Link extends Model
{
public function link_list()
{
// 🔑 Bir link yalnızca tek bir listeye ait olabilir
return $this->belongsTo(LinkList::class);
}
}
4. Yeni Kayıt Ekleme İşlemini Test Etme
Yeni link ekleme işlemini test edelim.
Link Ekleme:
docker-compose exec app php artisan link:new
Komut satırında URL, açıklama ve liste adı gibi bilgileri girin.
Kayıtları Kontrol Etme:
Eklediğiniz kaydın ilişkili olduğu listeyi de görüntüleyin:
docker-compose exec app php artisan link:show
Sıkça Sorulan Sorular (SSS)
save()velinks()->save()arasındaki fark nedir?
save(), mevcut modeli doğrudan veritabanına kaydeder. links()->save() ise, ilişkili veriyi (yani linki) başka bir modele bağlar ve kaydeder.
foreignIdFor(LinkList::class)ne işe yarar?
Bu metod, LinkList modelinin referansını tutan bir yabancı anahtar (foreign key) sütunu oluşturur.
firstWhere('slug', $list_name)nasıl çalışır?
Bu metod, LinkList modelinde slug sütunu verilen $list_name ile eşleşen ilk kaydı bulur. Bu, ilişkisel veriye hızlıca erişmeyi sağlar.
- Eloquent ile ilişkiler nasıl çalışır?
hasMany metodu, bir modelin birden fazla ilişkisine sahip olmasını sağlarken, belongsTo metodu bir modelin başka bir modele ait olmasını sağlar.
db:wipekomutu ne işe yarar, riskli midir?
db:wipe, veritabanındaki tüm tabloları ve veriyi tamamen siler. Geliştirme ortamında tabloları sıfırlamak için kullanışlıdır. Canlı sistemlerde veri kaybına yol açacağı için kullanılması kesinlikle önerilmez.
Sonuç
Artık Laravel Eloquent ile bire-çok ilişkilerini güvenli bir şekilde yönetebilir ve veritabanınıza veri eklerken ilişkisel verileri de kaydedebilirsiniz. Bu araçları kullanarak geliştirme süreçlerinizi hızlandırabilirsiniz. Rabisu Bulut platformunda benzer altyapılar için hemen başlayabilirsiniz.