Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order by sum column relationship in Laravel

Tags:

laravel

I have this controller which grabs posts from a post table. Every post in the posts table have the relation "hasMany" with another table likes.

Controller:

public function getDashboard(){
        $posts = Post::orderBy('created_at', 'desc')->get(); 

        return view('dashboard', ['posts' => $posts]);
}

I'd like to replace 'created at' with something like:

$post->likes->sum(like)

Don't know how to write the right syntax though.

EDIT:

Here are the tables.

Posts  
--id   
--body  
Likes 
--id  
--post_id  
--like

The column like can have the value 1 or -1. I'd like to order on the summation of that column for each post. So a post with one dislike(-1) and one like(1) will have the aggregated value of 0, hence will be placed after a post with one like(1).

like image 449
Adam Avatar asked Sep 12 '25 06:09

Adam


2 Answers

You can use withCount() for this as:

Post::withCount('likes')->orderBy('likes_count')->get()

withCount() will place a {relation}_count column on your resulting models

Update

Post::withCount(['likes' => function($q) {
    $q->where('like', 1)
}])
->orderBy('likes_count')
->get()

Update2

You can use sortByDesc() to sort your collection as:

$posts = Post::get();

$posts = $posts->sortByDesc(function ($post) {
            return $post->likes->sum('like');
        });
like image 112
Amit Gupta Avatar answered Sep 15 '25 02:09

Amit Gupta


If you want to sum column value from relationship and then sort records.

$users = User::addSelect(['likes' => Post::selectRaw('sum(likes) as total_likes')
     ->whereColumn('user_id', 'useres.id')
     ->groupBy('user_id')
 ])
 ->orderBy('likes', 'DESC')
 ->get()
 ->toArray();

Or use below

$users = User::select("*", 
               \DB::raw('(SELECT SUM(likes) FROM likes_table WHERE likes_table.user_id = users.id) as tolal_likes'))
        ->orderBy('likes', 'DESC')
        ->get()
        ->toArray();
like image 22
Afraz Ahmad Avatar answered Sep 15 '25 03:09

Afraz Ahmad



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!