Laravel'de Polymorphic İlişkiler: Bayi ve Müşteri Ödeme Kayıtları

Laravel'de Polymorphic İlişkiler: Bayi ve Müşteri Ödeme Kayıtları

·

4 min read

Merhaba! Bugün, Laravel'de polymorphic ilişkilerin nasıl kullanılacağını ve özellikle bayi ve müşteri ödeme kayıtları üzerinde nasıl uygulanacağını inceleyeceğiz. Polymorphic ilişkiler, farklı model türlerinin birbiriyle ilişkili olmasını sağlayan güçlü bir özellik sunar. Bu özellik, uygulamamızda veri yönetimini daha esnek hale getirir. Hadi, bu konuyu daha iyi anlamak için örnek bir uygulama üzerinden gidelim.

Polymorphic İlişkiler Nedir ve Neden Kullanılır?

Polymorphic ilişkiler, bir modelin birden fazla model ile ilişkili olmasını sağlar. Örneğin, bir Payment (Ödeme) kaydı, hem Customer (Müşteri) hem de Dealer (Bayi) ile ilişkilendirilebilir. Bu durumda, tek bir payments tablosu oluşturarak, hem müşteri hem de bayi ödemelerini bu tabloda tutabiliriz. Bu sayede, veri tutarlılığını artırır ve sorgulama işlemlerini kolaylaştırır.

Polymorphic ilişkiler, veritabanı yapısında esneklik sağlayarak, farklı türdeki verilerin aynı yapıda yönetilmesine imkan tanır. Örneğin, bir uygulamada hem müşterilerin hem de bayilerin ödemelerini takip etmek istediğinizde, her iki modelle de ilişki kurabilen tek bir payments tablosu oluşturmak mantıklı bir çözümdür.

1. Veritabanı Yapısının Oluşturulması

Laravel’de polymorphic ilişkiler kurabilmek için öncelikle gerekli veritabanı tablolarını oluşturmamız gerekiyor. Bu örneğimizde dealers, customers ve payments adında üç tabloya ihtiyacımız var.

1.1 Dealer Tablosu Migration’ı

İlk olarak, bayi bilgilerini tutacak olan dealers tablosunu oluşturalım:

// database/migrations/2023_11_05_000001_create_dealers_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateDealersTable extends Migration
{
    public function up()
    {
        Schema::create('dealers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('dealers');
    }
}

1.2 Customer Tablosu Migration’ı

Ardından, müşteri bilgilerini tutacak olan customers tablosunu oluşturalım:

// database/migrations/2023_11_05_000002_create_customers_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCustomersTable extends Migration
{
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('customers');
    }
}

1.3 Payment Tablosu Migration’ı

Son olarak, ödeme kayıtlarını tutacak olan payments tablosunu oluşturalım. Burada morphs metodu ile polymorphic ilişkiyi sağlayacak olan alanları ekleyeceğiz.

// database/migrations/2023_11_05_000003_create_payments_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePaymentsTable extends Migration
{
    public function up()
    {
        Schema::create('payments', function (Blueprint $table) {
            $table->id();
            $table->decimal('amount', 10, 2);
            $table->string('status');
            $table->morphs('payable'); // Polymorphic ilişki için
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('payments');
    }
}

2. Modellerin Tanımlanması

Veritabanı tablolarımız oluşturulduktan sonra, bu tablolara karşılık gelen modellerimizi tanımlayalım.

2.1 Dealer Modeli

Dealer modelini oluşturarak, bu modelin payments ilişkisini ekleyelim:

// app/Models/Dealer.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Dealer extends Model
{
    protected $fillable = ['name', 'email'];

    public function payments()
    {
        return $this->morphMany(Payment::class, 'payable');
    }
}

2.2 Customer Modeli

Benzer şekilde, Customer modelini oluşturalım:

// app/Models/Customer.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
    protected $fillable = ['name', 'email'];

    public function payments()
    {
        return $this->morphMany(Payment::class, 'payable');
    }
}

2.3 Payment Modeli

Son olarak, Payment modelini oluşturalım ve payable ilişkisini tanımlayalım:

// app/Models/Payment.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model
{
    protected $fillable = ['amount', 'status'];

    public function payable()
    {
        return $this->morphTo();
    }
}

3. Ödeme Verilerinin Eklenmesi

Şimdi, oluşturduğumuz modeller üzerinden veri ekleyelim. Hem bir bayi hem de bir müşteri oluşturarak her birine ödeme kaydı ekleyeceğiz.

use App\Models\Dealer;
use App\Models\Customer;
use App\Models\Payment;

// Yeni bir bayi oluştur
$dealer = Dealer::create(['name' => 'Bayi A', 'email' => 'bayi@example.com']);

// Yeni bir müşteri oluştur
$customer = Customer::create(['name' => 'Müşteri A', 'email' => 'musteri@example.com']);

// Bayi için bir ödeme ekle
$dealerPayment = new Payment(['amount' => 1500, 'status' => 'completed']);
$dealer->payments()->save($dealerPayment);

// Müşteri için bir ödeme ekle
$customerPayment = new Payment(['amount' => 300, 'status' => 'pending']);
$customer->payments()->save($customerPayment);

// Bayi ve müşteriye ait ödemeleri çekelim
$dealerPayments = $dealer->payments;  // Bayiye ait tüm ödemeler
$customerPayments = $customer->payments; // Müşteriye ait tüm ödemeler

4. Ödemenin Hangi Modele Ait Olduğunu Kontrol Etme

Elde ettiğimiz bir ödeme kaydının hangi modele ait olduğunu kontrol etmek için payable ilişkisini kullanabiliriz.

$payment = Payment::find(1); // ID'si 1 olan ödemeyi çekiyoruz

if ($payment->payable_type == 'App\Models\Dealer') {
    echo "Bu ödeme bir bayiye ait.";
} elseif ($payment->payable_type == 'App\Models\Customer') {
    echo "Bu ödeme bir müşteriye ait.";
}

// Veya direkt modeli alarak işlem yapabiliriz
$parentModel = $payment->payable;
echo $parentModel->name; // Bayi veya Müşteri modelinin adını alır

Laravel’in polymorphic ilişkileri, farklı türde modellerle ilişkilendirilmesi gereken verileri düzenli ve esnek bir şekilde yönetme imkanı sunar. Bu makalede, hem bayilere hem de müşterilere ait ödeme kayıtlarını tek bir Payment tablosunda tutarak, bu iki model ile aynı ilişkiler üzerinden çalışabilme yeteneğimizi gösterdik. Bu yapı, veri yönetimini daha etkili hale getirirken, uygulama geliştirme sürecinde de büyük kolaylık sağlar. Polymorphic ilişkilerin sunduğu bu esneklik, yazılım projelerinin gereksinimlerine uygun çözümler üretme konusunda önemli bir avantaj sunmaktadır.