Вариант 1:
Вы должны использовать объединения в запросе:
$books = Books::select('books.*')
->leftJoin('chapters', 'chapters.book_id', '=', 'books.id')
->groupBy('books.id')
->orderByDesc('chapters.updated_at')
->get();
Вариант 2:
Есливам не нужно разбивать на страницы и показывать все книги на одной странице, вы можете попробовать отсортировать коллекцию по значению отношения.
Добавить отношение latestChapter:
public function latestChapter()
{
return $this->hasOne(Chapter::class)->orderByDesc('updated_at');
}
Получить и отсортировать:
$books = Books::with('latestChapter')->get();
$books = $books->sortByDesc(function($item){
return $item->latestChapter ? $item->latestChapter->updated_at : '1970-01-01';
});