Dinamik bir lisans paketi yapmaya çalışıyorum. License
ve Product
adında iki modelim ve tablolarım var. Bununla beraber birden fazla modelin product olma ihtimali var ve onların ne olduğunu bilmiyorum. Bu durumda morph relationship kullanmam gerekiyor. Örnekleri uygulamakta sürekli sorun yaşadım ve sonunda kendim bir şekilde çözdüm ama bu yöntem tam olarak kafama yatmadı.
Migration dosyalarım şöyle;
Schema::create('licenses', function (Blueprint $table) {
$table->bigIncrements('id');
$table->foreignId('user_id')
->nullable()
->constrained('users')
->onDelete('cascade');
$table->foreignId('created_by')
->nullable()
->constrained('users')
->onDelete('cascade');
$table->string('domain', 200)->unique();
$table->uuid('license_key')->unique();
$table->enum('status', ['active', 'inactive', 'suspended'])->default('active');
$table->dateTime('expiration_date')->nullable();
$table->boolean('is_trial')->default(false);
$table->boolean('is_lifetime')->default(false);
$table->softDeletes();
$table->timestamps();
});
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name', 20);
$table->text('description')->nullable();
$table->timestamps();
});
Schema::create('licensable_products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->morphs('licensable');
$table->foreignId('license_id')
->constrained("{$this->prefix}_licenses")
->onDelete('cascade');
$table->foreignId('user_id')
->nullable()
->constrained("users")
->onDelete('cascade');
$table->index(['licensable_id', 'licensable_type']);
$table->unique(
['license_id', 'licensable_id', 'licensable_type'],
'ls_licensable_products_id_to_id_unique'
);
$table->timestamps();
});
Modellerimde böyle;
License.php
class License extends Model
{
protected $table = 'licenses';
}
Product.php
class Product extends Model
{
protected $table = 'products';
public function licensable()
{
return $this->morphOne(LicensableProduct::class, 'licensable');
}
}
LicensableProduct.php
class LicensableProduct extends Model
{
protected $table = 'licensable_products';
public function license(): BelongsTo
{
return $this->belongsTo(License::class);
}
}
Ürün için yeni bir lisans oluşturmak için şu kodu yazdım ve işini yapıyor ama migration dosyasında da belirttiğim gibi relation oluşturmak istediğim model için benzersiz olmalı ama aynı kaydı birden fazla ekleyebiliyorum.
Yani licensable_products
tablosunda her yeni eklenen kayıt license_id
, licensable_id
, licensable_type
alanlarıyla benzersiz olmalı ama yeni kayıt ekleyebiliyor ve MySQL tarafında duplicated hatası almıyorum.
Product::find(1)->licensable()->create(['license_id'=> $license->id])
ve eklediğim kaydın lisansına kadar ulaşmak istiyorsam aşağıdaki kod çalışıyor ama yazım şekli çok garip oldu. Bunun best practice'i nedir?
Product::find(1)->licensable()->first()->license()->first()
Son olarak, lisans modelinden morph uygulanan modeli nasıl döndürebilirim?