1

Here is my query which works as well:

SELECT sum(r.rating) as rank,b.* FROM books as b
LEFT JOIN ranks as r ON b.id = r.book_id
WHERE 1
GROUP BY (b.id)
ORDER BY rank DESC

Now I want to do the same in Laravel. Here is what I've tried:

// Book model
class Book extends Model
{
    public function ranks()
    {
        return $this->hasMany(Rank::class)->sum("rating");
    }
}

// Controller
$obj = new Book;
$get = $obj->ranks()->orderBy('rating', 'desc')->get();

It throws this error:

Call to a member function groupBy() on integer

Any idea how can I fix this problem?

stack
  • 10,280
  • 19
  • 65
  • 117
  • You might find an answer here: https://stackoverflow.com/questions/28267550/how-to-group-and-sum-a-pivot-table-column-in-eloquent-relationship – sybear Feb 25 '18 at 20:32

1 Answers1

2
public function ranks() {
    return $this->hasMany(Rank::class)
        ->select('book_id', \DB::raw('sum(`rating`) as `rank`'))
        ->groupBy('book_id');
}

$books = Book::with('ranks')->get();
$sortedBooks = $books->sortByDesc(function($book) {
    return $book->ranks->sum('rank');
});
Jonas Staudenmeir
  • 24,815
  • 6
  • 63
  • 109