Skip to main content

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.


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.

Yeni LinkList modeli için bir göç dosyası oluşturun:


docker-compose exec app php artisan make:migration create_link_lists_table

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.

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);
}
}

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.


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)

  1. save() ve links()->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.

  1. foreignIdFor(LinkList::class) ne işe yarar?

Bu metod, LinkList modelinin referansını tutan bir yabancı anahtar (foreign key) sütunu oluşturur.

  1. 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.

  1. 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.

  1. db:wipe komutu 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.