gulhanH Merhaba, foruma hoş geldiniz.
Öncelikle isimlendirmeleri düzeltelim; ilişkilerde HasOne, BelongsTo gibi tekil sonuç getiren ilişkilerin ismi tekil, HasMany, BelongsToMany gibi çoğul ilişkilerin isimleri çoğul olur. Bu kurala uymazsanız koda bakan kişinin kafası karışır. Mesela $brand->brandVersion yazdığınızda sanki Brand'ın sadece bir tane BrandVersion kaydı varmış gibi duruyor (isim de brandVersion olduğu için modelin adı da BrandVersion gibi düşünüyoruz ne yazık ki). Öyleyse:
app/Models/Brand.php
public function versions(): HasMany
{
return $this->hasMany(Version::class);
}
app/Models/Version.php
public function brand(): BelongsTo
{
return $this->belongsTo(Brand::class);
}
public function products(): BelongsTo
{
return $this->hasMany(Product::class);
}
app/Models/Product.php
public function version(): BelongsTo
{
return $this->belongsTo(Version::class);
}
şeklinde mantıklı isimlendirmeler vermelisiniz. Tablo içinde ilişki için tanımadığınız keylerin adı da brand_id, product_id, version_id gibi ilişki isimlerine uyduğu için ilişkilere bu keyleri eklememe de gerek kalmadı, onları artık otomatik görecek. Eğer bu isimlendirme sistemine uymazsanız keyleri elle verirsiniz.
Burada bir Brand verildiğinde onun altındaki Product modellerini istiyorsunuz. Aslında şu şekilde bir yapı kurduğunuz için:
brands
id ───────┐
versions │
id ───────┼───┐
brand_id ─┘ |
products |
id |
version_id ───┘
Laravel'de direkt bunu karşılayan bir ilişki var: HasManyThough:
https://laravel.com/docs/11.x/eloquent-relationships#has-many-through
Bunu kullanmak için
app/Models/Brand.php
public function products(): HasManyThrough
{
return $this->hasManyThrough(Product:class, Version::class);
}
Böylece artık şöyle yapabilirsiniz:
$brand = Brand::findOrFail($id);
return view('front.product.products-list', compact('brand'));
@foreach($brand->products as $product)
{{ $product->name }}
@endforeach
Sayfalama yapmak isterseniz:
$brand = Brand::findOrFail($id);
$products = $brand->products()
->paginate();
return view('front.product.products-list', compact('brand', 'products'));
@foreach($products as $product)
{{ $product->name }}
@endforeach
Diğer bir yol da:
$brand = Brand::findOrFail($id);
$versionIds = $brand->versions()
->pluck('id')
->toArray();
$products = Product::whereIn('version_id', $versionIds)
->paginate();
return view('front.product.products-list', compact('brand', 'products'));
Bir de şu konuya göz atın:
https://laravel.com/docs/11.x/eloquent-relationships#eager-loading