$yorum->user->email,
$yorum->haber->link,
$yorum->sinav->link şeklinde bir kullanım demek
Yorum modeli kesinlikle ama kesinlikle bir
User,
Haber ve
Sinav modeline sahip demektir.
Trying to get property of non-object hatası alıyorsanız demek ki yorumlardan biri herhangi bir
User,
Haber ya da
Sinav modeli ile bağlantılı kayda sahip değil, yani bunlardan biri
null dönüyor.
Bu gibi durumlarda
optional() yardımcı fonksiyonu kullanabilirsiniz. (Laravel 5.5 ve 5.6'da var ama kolayca 5.4 içine de aktarılabilir.)
optional() yardımcı fonksiyonu eğer obje
null ise non-object hatası yerine hata vermeden özelliğin de
null olarak dönmesini sağlar.
https://laravel.com/docs/5.6/helpers#method-optional
Yani blade içerisinde
$yorum->user->email yerine
optional($yorum->user)->email şeklinde yazın. Diğerleri de optional($yorum->haber)->link ve optional(optional($yorum->sinav)->link şeklinde olacak demektir. Böylece hangi kayıt bağlantılı değil onu da görmüş olursunuz.
Diğer bir yol ise sadece sadece ilişkiye sahip kayıtları çekmek:
https://laravel.com/docs/5.6/eloquent-relationships (Querying Relationship Existence bölümü)
// has('user') kullanarak mutlaka User'a sahip 5 yorumun gelmesini sağladık.
// Bu whereNotNull('user_id') ile farklıdır çünkü has modelin gerçekten olup olmadığını kontrol eder. user_id dolu olabilir ama o id'ye sahip bir User olduğunu bilemeyiz.
Yorum::has('user')->where('onay',1)->orderBy('id', 'desc')->take(5)->get();
Size bir de birkaç ipucu vereyim:
{{ $yorum->tur== 1 ? $yorum->haber->link : $yorum->sinav->link }}
Böyle yapmak yerine Yorum modeline bir tane accessor ekleyebilirsiniz:
https://laravel.com/docs/5.6/eloquent-mutators#accessors-and-mutators
// Yorum.php
public function getLinkByTypeAttribute()
{
if($this->tur == 1) {
return optional($this->haber)->link;
}
return optional($this->sinav)->link;
}
Böylece sadece şöyle kullanabilirsiniz:
<a href="{{ $yorum->link_by_type }}">...</a>
timeConvert diye bir fonksiyon kullanmışsınız. Tarihi nasıl çeviriyor bilmiyorum ama modellerde created_at zaten Carbon objesi olarak döndüğü için şöyle yapabilirsiniz:
// null olmadığını varsayarsak
$yorum->user->created_at->format('d.m.Y H:i')