byhk44
$data = Haber::with('haber_kategoriler')
->latest('created_at')
->get();
şeklinde haberleri kategorileri ile birlikte, created_at alanına göre en son eklenen en başta olacak şekilde çekebilirsiniz. Bu with(...) kullanımına Eager Loading diyoruz:
https://laravel.com/docs/8.x/eloquent-relationships#eager-loading
Şablon içinde ise artık haberler döndüğünüz iterasyonda kategorisine şöyle erişebilirsiniz:
@foreach($data as $haber)
<td>
{{ $haber->title }}
{{ $haber->haber_kategoriler->pluck('name')->implode(', ') }}
</td>
@endforeach
$haber->haber_kategoriler->pluck('name')->implode(', ')
şeklinde yaptığım kısım kategorilerin isimlerini çekip, virgül ile ayrılmış stringe çeviriyor, spor, futbol gibi Böyle yapmamın sebebi BelongsToMany kullandığınız için haberin sadece bir kategorisi bile olsa size Collection döner, yani çoğul döner, yani iterasyon gerektirir. Mesela şöyle yapılabilir:
@foreach($data as $haber)
<td>
<h3>{{ $haber->title }}</h3>
@foreach($haber->haber_kategoriler as $kategori)
<span>{{ $kategori->name }}</span>
@endforeach
</td>
@endforeach
İlişki isimleri snake_case olmaz, camelCase kullanmanız gerekiyor:
public function haberKategoriler(): BelongsToMany
{
return $this->belongsToMany(HaberKategori::class, 'haber_kategori_s');
}
Şu yazdığınız kod ne yaptığınızı bilmiyorsanız çok yanlış bir kullanım:
$data = Haber::all()->sortByDesc('created_at');
Bu bütün haberleri önce çek ondan sonra created_at alanına göre sırala demek. Şöyle yapmanız lazım (sayfalama kullanmadığınız için yine tüm kayıtları çekecek ama sıralama veritabanı düzeyinde olacağı için daha performanslı olacak):
$data = Haber::orderByDesc('created_at')->get(); // orderByDesc() yerine latest() de kullanabilirsiniz.
Dokümanları okumanız gerekiyor:
https://laravel.com/docs/8.x
Lütfen kod paylaşımı ile ilgili şu yazıyı okuyun, bu seferlik kodlarınızı ben düzeltiyorum:
https://laravel.gen.tr/d/4903-onemli-forumda-kod-paylasirken-dikkat-edilmesi-gerekenler