3 namespace BookStack\Entities\Queries;
5 use BookStack\Entities\Models\Book;
6 use BookStack\Exceptions\NotFoundException;
7 use Illuminate\Database\Eloquent\Builder;
9 class BookQueries implements ProvidesEntityQueries
11 public function start(): Builder
16 public function findVisibleById(int $id): ?Book
18 return $this->start()->scopes('visible')->find($id);
21 public function findVisibleByIdOrFail(int $id): Book
23 return $this->start()->scopes('visible')->findOrFail($id);
26 public function findVisibleBySlugOrFail(string $slug): Book
28 /** @var ?Book $book */
29 $book = $this->start()
31 ->where('slug', '=', $slug)
35 throw new NotFoundException(trans('errors.book_not_found'));
41 public function visibleForList(): Builder
43 return $this->start()->scopes('visible');
46 public function visibleForListWithCover(): Builder
48 return $this->visibleForList()->with('cover');
51 public function recentlyViewedForCurrentUser(): Builder
53 return $this->visibleForList()
54 ->scopes('withLastView')
55 ->having('last_viewed_at', '>', 0)
56 ->orderBy('last_viewed_at', 'desc');
59 public function popularForList(): Builder
61 return $this->visibleForList()
62 ->scopes('withViewCount')
63 ->having('view_count', '>', 0)
64 ->orderBy('view_count', 'desc');