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.