@Arda ve @tgezginis,
Önceki cevabımda sorunun çözümünü gösterdim ama önemli hususlardan birisi hangi alanların gösterileceğinin seçimidir. Aslında daha önce çözüm olarak önerilen fakat sonradan iki tablonun id sütunlarının karışması nedeniyle vazgeçilen şu cümlede uygun alanlar seçilseydi ( "->select(DB::raw('posts.*, count(likes.post_id) as toplam'))" ) düzgün bir sonuç elde edilecekti.
$data = Post::join('likes', 'likes.post_id', '=', 'posts.id')->groupBy('post_id')->orderBy(DB::raw('count(*)'),'desc')->get();
Ben "*" kullanmayı sevmiyorum, count(*) yerine count(alanadı) kullanmayı seviyorum (gerçi, posts tablosunun alan isimlerini bilmediğim için "'posts.*" kullanmak durumunda kaldım), fakat mySQL için
->orderBy(DB::raw('count(*)'),'desc')
kullanımı yanlış olmaz.
>orderBy(DB::raw('count(likes.post_id)'),'desc')
ile aynı sonucu verecektir. Çünkü her ikisinde de count işlemi sonuç olarak, groupBy ile belirtilen alan adına göre her grup için yapılacaktır ve o grubun kaç satırı olduğunu gösterecektir. Sorgudan groupBy fonksiyonu çıkartıldığında tüm satır sayısını gösterecektir.
>orderBy(DB::raw('count(likes.*)'),'desc')
ise hata verecektir.
$data = Post::join('likes', 'likes.post_id', '=', 'posts.id')->groupBy('post_id')->orderBy(DB::raw('count(*)'),'desc')->select(DB::raw('posts.*, count(likes.post_id) as toplam'))->get();
return dd($data);
ile ve orderBy kısmını her üç şekilde değiştirerek hangilerinin çalıştığı test edilebilir.