byhk44 Aslında size nasıl yapıldığını gösterdim. Eğer PHP 8+ kullanıyorsanız null-safe operatörü kullanıyorsunuz. Örneğin:
$var = null;
echo $var?->prop; // Hata vermez, null döner
echo $var?->method(); // Hata vermez, null döner
Sizin örnekte ise:
$fotograf1 = $urun->urunFotograf
->sortBy('siralama')
->first()? // buradaki soru işaretine dikkat edin.
->fotograf;
Eğer PHP < 8 kullanıyorsanız Laravel'in optional() yardımcı yöntemi var. Null-safe operatörü gibi çalışıyor. Kullanımı ise:
$var = null;
echo optional($var)->prop; // Hata vermez, null döner
echo optional($var)->method(); // Hata vermez, null döner
$fotograf1 = optional($urun->urunFotograf
->sortBy('siralama')
->first())
->fotograf;
Eğer Laravel 8+ kullanıyorsanız ise bu işin asıl doğru/Laravel yolu ise Has One Of Many ilişkisi kullanmak. Öncelikle isimlendirmenizdeki yanlışları düzeltelim. Ürün ile fotoğraf arasında HasMany ilişkisi kurmuşsunuz, bir ürünün birden fazla fotoğrafı olabilir demişsiniz. O yüzden bir fotoğrafa ulaşmak için ->first()
kullanıyorsunuz. Buna rağmen aradki ilişkiye urunFotograf demişsiniz. Böyle Türkçe isim kullanacaksanız ilişkinin adı urunFotograflari olmalı:
public function urunFotograflari(): HasMany
{
return $this->hasMany(Fotograf::class, 'urun_id');
}
Fotoğrafları tutan tablonuzda siralama isimli bir alan var ve siz bu alana göre sıralayıp ilk yadı almak istiyorsunuz. Normalde yapmanız gereken şu (Has One Of Many ilişkisi):
public function kapak(): HasOne
{
return $this->hasOne(Fotograf::class, 'urun_id')
->ofMany('siralama', 'min')
->withDefault();
}
Artık ilk resime şöyle ulaşabilirsiniz:
$fotograf = $urun->kapak->fotograf;
İlişkide withDefault() kullandığımız için eğer bir fotoğraf yoksa Laravel size boş bir Fotograf objesi verir ve null-safe operatörü gibi hata almadan ilk seviye özelliklerine ulaşabilirsiniz. Örneğin:
// Ürünün fotoğrafı yoksa hata vermez, null döner.
$fotografId = $urun->kapak->id;
// İlk seviye sonrası yine null-safe operatör ya da optional() kullanmalısınız
$galeriId = $urun->kapak->galeri?->id;