Laravel öğreniyorum ve ansayfayı bloklar halinde kategorilere bölmek istiyorum. arka taraftan manuel olarak kategori isimlerini yazıyor ve onları değişkene atayıp view e gönderdikten sonra kullanıyorum ama bu işi ne kadar mantıklı ve verimli yapıyorum bilemiyorum. Modelde yazdığım fonksiyon genelde sabit oluyor ya da her kategori için ayrı fonksiyon oluşturmak gerek onun yerine bunu controllerda yapmayı düşündüm ama dediğim gibi kod tekrarı var. Sizce bunu başka nasıl yapabilirim?
Görünüm
Category Model
class Category extends Model
{
public function articleCount(){
return $this->hasMany('App\Models\Article','category_id','id')->count();
}
public function getArticles(){
return $this->hasMany('App\Models\Article','category_id','id')->orderBy('created_at','desc')->limit(3)->get();
}
//
}
Anasayfa Controller
public function index(){
// $getArt = $category1->getArticles();
// Eğer category modelinde hazırladığın fonksiyonu kullanmak istiyorsan bunu ( $getArt) seç ama o zaman limit işlemini orada yapman gerekecek
$articles= Article::OrderBy('created_at','DESC')->paginate(10);
$category1= Category::where('slug','genel')->first(); //viewde modeldeki fonksiyonu kullanabilirsin ama limit işlemi orada ya da viewde for döngüsü ile
$category2= Category::where('slug','eglence')->first();
$category3= Category::where('slug','ekonomi')->first();
$category4= Category::where('slug','magazin')->first();
$category5= Category::where('slug','siyaset')->first();
$category6= Category::where('slug','spor')->first();
$articles1= Article::where('category_id',$category1->id)->OrderBy('created_at','DESC')->limit(3)->get();
$articles2= Article::where('category_id',$category2->id)->OrderBy('created_at','DESC')->limit(3)->get();
$articles3= Article::where('category_id',$category3->id)->OrderBy('created_at','DESC')->limit(3)->get();
$articles4= Article::where('category_id',$category4->id)->OrderBy('created_at','DESC')->limit(3)->get();
$articles5= Article::where('category_id',$category5->id)->OrderBy('created_at','DESC')->limit(3)->get();
$articles6= Article::where('category_id',$category6->id)->OrderBy('created_at','DESC')->limit(3)->get();
foreach ($articles as $article) {
if($article->image!=true){
$article->image ='https://stockpictures.io/wp-content/uploads/2020/01/image-not-found-big-768x432.png';
}
}
$data['articles']= $articles; //get() komutu hepsini getirir paginate(6) komutu içine yazılan kadar getirir
$data['articles1'] = $articles1;
$data['articles2'] = $articles2;
$data['articles3'] = $articles3;
$data['articles4'] = $articles4;
$data['articles5'] = $articles5;
$data['articles6'] = $articles6;
$data['category1'] = $category1;
//dd($category1);
return view('front.homepage',$data);
}
Anasayfa Blade
ilk seçenek
<h1>Genel Kategorisi</h1>
@foreach ($category1->getArticles()->chunk(3) as $category) //Modeldeki fonksiyonu çağırarak
<div class="row mb-2">
<div class="card-deck">
@foreach ($category as $cat)
<a href="{{route('single', [$cat->getCategory->slug,$cat->slug] )}}">
<div class="card">
<img class="card-img-top img-fluid" src="https://source.unsplash.com/400x250/" alt="Card image cap">
<div class="card-body pt-1">
<div class="row border" style="font-size:.7rem">
<a href="#">{{$cat->getCategory->name}}</a>
</div>
<div class="row border">
<h2 class="card-title" style="font-size:.8rem">{{$cat->title}}</h2>
</div>
</div>
<div class="card-footer">
<small class="text-muted" style="font-size:.7rem">Last updated 3 mins ago</small>
</div>
</div>
</a>
@endforeach
</div>
</div>
@endforeach
2. seçenek
<h2>genel 2</h2>
@foreach($articles1->chunk(3) as $chunk)
<div class="row mb-2">
<div class="card-deck">
@foreach($chunk as $add)
<a href="{{route('single', [$add->getCategory->slug,$add->slug] )}}">
<div class="card">
<img class="card-img-top img-fluid" src="https://source.unsplash.com/400x250/" alt="Card image cap">
<div class="card-body pt-1">
<div class="row border" style="font-size:.7rem">
<a href="#">{{$add->getCategory->name}}</a>
</div>
<div class="row border">
<h2 class="card-title" style="font-size:.8rem">{{$add->title}}</h2>
</div>
</div>
<div class="card-footer">
<small class="text-muted" style="font-size:.7rem">Last updated 3 mins ago</small>
</div>
</div>
</a>
@endforeach
</div>
</div>
@endforeach