umutcankarce
Modeller Product, Category, ProductAttribute, ProductAttributeValue, ProductVariant, Shop ve ProductStock olmak üzere;
Product ile Category arasında product_categories tablosu aracılığıyla many-to-many dediğimiz BelongsToMany ilişkisi kuracaksınız:
https://laravel.com/docs/11.x/eloquent-relationships#many-to-many
app/Models/Product.php:
public function categories(): BelongsToMany
{
return $this->belongsToMany(Category::class, 'product_categories', 'product_id', 'category_id');
}
app/Models/Category.php:
public function products(): BelongsToMany
{
return $this->belongsToMany(Product::class, 'product_categories', 'category_id', 'product_id');
}
ProductAttribute ile ProductAttributeValue arasında one-to-many dediğimiz HasMany ilişkisi kuracaksınız (values ismi genel bir isim ve bu isimde yöntemler olduğu için karışmaması adına ilişki adını values değil attributeValues yapıyorum)
https://laravel.com/docs/11.x/eloquent-relationships#one-to-many
app/Models/ProductAttribute.php:
public function attributeValues(): HasMany
{
return $this->hasMany(ProductAttributeValue, 'attribute_id');
}
ProductAttributeValue ile ProductAttribute arasında ise one-to-one ilişkisi kuracağız ama ilişkiyi sağlayan sütun ProductAttributeValue modelinin tablosunda, yani kendinde olduğu için HasOne değil BelongsTo kullanacağız:
https://laravel.com/docs/11.x/eloquent-relationships#one-to-one-defining-the-inverse-of-the-relationship
app/Models/ProductAttributeValue.php:
public function productAttribute(): BelongsTo
{
return $this->belongsTo(ProductAttribute, 'attribute_id');
}
Product ile ProductAttribute arasında product_attributes tablosu aracılığıyla many-to-many dediğimiz BelongsToMany ilişkisi kuracaksınız. Bu sırada ProductAttributeValue değerini de pivot alan olarak bu tabloda tutmanız gerekiyor yoksa bunun için de ayrı bir tablo olluşturmanız gerekecek. Buna gerek yok ama value_id bize bir ProductAttributeValue vermesi gerektiği için bu ilişkiye bir tane pivot model dahil etmemiz gerekiyor, o da AttributeProduct olsun:
https://laravel.com/docs/11.x/eloquent-relationships#defining-custom-intermediate-table-models
app/Models/Product.php:
public function productAttributes(): BelongsToMany
{
return $this->belongsToMany(ProductAttribute::class, 'product_attributes', 'product_id', 'attribute_id')
->using(AttributeProduct::class);
->withPivot('value_id')
}
Product ile ProductVariant arasında HasMany ve BelongsTo ilişkisi kuracaksınız:
app/Models/Product.php:
public function variants(): HasMany
{
return $this->hasMany(ProductVariant, 'product_id');
}
app/Models/ProductVariant.php:
public function product(): HasMany
{
return $this->belongsTo(Product, 'product_id');
}
Shop, Product ve ProductVariant ile ProductStock arasında ise yine HasMany ve BelongsTo ilişkileri kuracaksınız.
Şimdi ilişkileri yazalım ve İngilizce olarak düşünüp Türkçe'ye çevirelim:
Product BelongsToMany Category
Ürün birçok kategoriye aittir
Category BelongsToMany Product
Kategori birçok ürüne aittir
Product HasMany Variant
Ürünün birçok varyantı var
Variant BelongsTo Product
Varyant (tek bir) ürüne ait