Loading...
Blog Featured Image

Laravel ile Benzer Yazıları/Ürünleri Bulma

Selam, daha önce mutlaka herhangi bir e-ticaret sitesinde bir ürünü incelerken ya da bir blog sitesinde yazılan yazıyı okurken 'benzer ürünler/benzer yazılar' şeklinde bir alanla karşılaşmışsınızdır, hadi Laravel ile nasıl yapılacağına bakalım.

Kaynak Kodu:

Models

Blog:

public function category():BelongsTo
    {
        return $this->belongsTo(Category::class);
    }

Category:

    public function posts()
    {
        return $this->belongsToMany('App\Post');
    }


Single Livewire Component Controller PHP:

#[Layout('components.layouts.content')]
class Single extends Component
{

    public $slug; //Route::get('/{slug}', Single::class);

    public function render()
    {
        $post = Blog::where('slug', $this->slug)->first();

        if (!$post) {
            abort(404);
        }

        $related = Blog::whereHas('category', function ($query) use ($post) {
            return $query->whereIn('name', $post->category->pluck('name')); 
        })
        ->where('id', '!=', $post->id) // Ziyaret edilen yazıyı benzer yazılarda yeniden görmemek için!
        ->limit(4) 
        ->get();

        return view('livewire.single', [
            'single' => $post,
            'related' => $related
        ])->title($post->title);
    }
}


Öncelikli olarak incelenmesi istenilen ürün/yazıyı slug ( url parametresi -  website.com/{slug} ya da website.com/blogs/{slug} şeklinde olabilir )veri tabanından buluyoruz, bu yazıyı hem gösterim için hem de benzer ürünleri/yazıları bulmak için kullanacağız.(Bu senaryoda Slug kullanılmıştır ve Slug aynı değere sahip olunmaması için veri tabanında unique olarak tanımlanmalı!)


Eğer url parametresi olarak alınan değer veri tabanında herhangi bir değere karşılık gelmiyorsa yani veri tabanında bulunamıyor ise devam etmiyor direk 404 sayfası gösteriyoruz. 


Eğer veri tabanından bir ürün/yazı bulunduysa devam ediyor ve artık benzer ürünleri/yazıları bulma aşamasına geçiyoruz. Bu aşamada iki noktaya değinmek zorundayım - whereHas() ve whereIn()


whereHas(): İlişki/Bağlılık kurulan tablodan filtre yapmak için kullanılır temel mantığı has() ve where() ile aynıdır sahip olunan bir özelliği kullanılarak filtre yapılır fakat whereHas fonksiyonu ile daha esnek filtreler yapılmasına olanak sağlamaktadır. 


whereIn(): İlgili sütunda, istenilen yani parametre olarak girilen değerleri tarar ve şartları sağlayanları geri döndürür.


Bu senaryo da Blog adlı tablodan 'category' alanına 'sahip' bu nokta çok önemli bu nedenle zaten has() veya whereHas() kullanılmaktayız. Sahip olunan alanı filtreliyoruz. Daha sonra 'category' alanına sahip olan yazıları alıyor ve ziyaret edilen yazının/ürünün kategorisi ile whereIn kullanarak yeniden filtreliyoruz. Yani mesela ziyaret ettiğimiz yazı Laravel kategorisine sahipse sadece Laravel kategorisine sahip yazıları alıyoruz. Son olarak ziyaret edilen yazıyı yeniden görmemek için ziyaret edilen yazının id si ile yeniden filtreliyoruz ve gösteriyoruz. Limit(4) şeklinde olması ahmtmtlu.com üzerinde ilgili alan 4 adet ile kısıtlı


Son olarak elde edilen yazı ve o yazıya benzer yazıları göstermek için Livewire'a gönderiyoruz.

Böylelikle 'Benzer Yazılar/Ürünleri' getirmiş oluyoruz, umarım yararlı olmuştur. 

Okuduğun için teşekkürler.