byhk44 İlişki isimleriniz yanlış. Bunu sürekli söylüyorum. Üstelik Türkçe yazmışsınız. Kategorideki ürünleri almaya çalışıyorsunuz, bu durumda $kategori->urunKategoriler() yerine ismi $kategori->urunler() olsa daha mantıklı olmaz mı? $kategori->urunKategoriler() yazınca ürünleri getirdiğini kim düşünür ki? İlk izlenimde ürün kategorilerini getirdiğini düşündürüyor ama sonra çıkış objesi $kategori olunca kategorinin içindeki ürün kategorilerini almaya çalışıyormuşsunuz gibi geliyor. Urun içinde urunFiyat() isimli bir ilişkiniz var, firstWhere kullandığınıza göre çoğul. Bu durumda adı urunFiyat() değil de fiyatlar() olsa daha mantıklı olmaz mı? Bilgisayar zaten anlar, siz kodları insan için yazın. Ben baktığımda neyin ne olduğunu az çok anlayabiliyorum ama $urun->urunFiyat gören biri az çok Eloquent ilişkilerinden anlıyorsa ilk aklına gelecek olan BelongsTo/HasOne'dır, HasMany düşünmez. Bunlar ciddi şeyler.
->orderBy('siralama','asc') zaten varsayılan olarak asc kullanır, onu yazmanıza gerek yok.
fiyat = $urun->urunFiyat->where('urun_id',$urun->id)
->firstWhere('grup_id', 1);
Burası bir Has One Of Many ilişkisi ile çözülür:
public function ilkGrupFiyati(): HasOne
{
return $this->hasOne(UrunFiyat::class, 'urun_id')
->ofMany(['id' => 'max'], static function ($query) {
$query->where('grup_id', 1);
});
}
public function fiyatlar(): HasMany
{
return $this->hasMany(UrunFiyat::class, 'urun_id')
}
$urunler = $kategori->urunler()
->with([
'ilkGrupFiyati',
'urunRenk.ozellikNitelik',
'urunMarka',
'urunDurum',
'fotografIlk'.
'fotografIkiNdf',
'urunStokBirimi',
'urunIliskiler'
])
->where('durum',1)
->orderBy('siralama')
->paginate(40)
->through(function($urun) use ($kategori) {
return (object)[
'kategoriAdi' => $kategori->kategori_adi,
'id' => $urun->id,
'urunAdi' => $urun->urun_adi,
'renkAdi' => $urun->urunRenk?->ozellikNitelik?->nitelik_adi,
'renkHex' => $urun->urunRenk?->ozellikNitelik?->hex,
'urunStok' => $urun->stok,
'marka' => $urun->urunMarka?->marka_adi,
'bsf' => $urun->ilkGrupFiyati->bsf,
'psf' => $urun->ilkGrupFiyati->psf,
'yeni' => $urun->urunDurum?->yeni === 1,
'fotograf1' => $urun->fotografIlk?->fotograf,
'fotograf2' => $urun->fotografIkiNdf?->fotograf,
'stokbirimi' => $urun->urunStokBirimi?->stokbirimi,
'url' => $urun->url,
"renkler" => $urun->urunIliskiler->where('durum',1)->where('tur','renk')->all(),
"uyeBegeni" => $urun->urunBegeni,
];
});
Bu şekilde sorgu sayısı sayfada kaç ürün gösterirseniz gösterin 10 gibi bir sayıya düşer.
through kullanmak yerine şu kısma bakın:
https://laravel.com/docs/9.x/eloquent-resources
$urun->urunDurum?->yeni === 1, yapmak yerine şu kısma bakın:
https://laravel.com/docs/9.x/eloquent-mutators#attribute-casting
$urun->urunIliskiler->where('durum',1)->where('tur','renk')->all(), yapmak yerine renkler() şeklinde bir ilişki tanımlayıp orada filtreleyin, collection üzerinde işlem yapmanıza gerek kalmaz. Nasıl bir ilişki bilmiyorum ama:
public function renkler(): BelongsToMany
{
return $this->belongsToMany(UrunIliski::class)
->wherePivot('durum', 1)
->wherePivot('tur', 'renk');
}
"renkler" => $urun->renkler,
gibi.
Yazacak şeyler bitmez, kendiniz bir şey uydurmadan önce dokümanları okumaya özen gösterin.