3 namespace BookStack\Entities\Queries;
5 use BookStack\Entities\Models\Chapter;
6 use BookStack\Exceptions\NotFoundException;
7 use Illuminate\Database\Eloquent\Builder;
10 * @implements ProvidesEntityQueries<Chapter>
12 class ChapterQueries implements ProvidesEntityQueries
14 protected static array $listAttributes = [
15 'id', 'slug', 'name', 'description', 'priority',
16 'book_id', 'created_at', 'updated_at', 'owned_by',
19 public function start(): Builder
21 return Chapter::query();
24 public function findVisibleById(int $id): ?Chapter
26 return $this->start()->scopes('visible')->find($id);
29 public function findVisibleByIdOrFail(int $id): Chapter
31 return $this->start()->scopes('visible')->findOrFail($id);
34 public function findVisibleBySlugsOrFail(string $bookSlug, string $chapterSlug): Chapter
36 /** @var ?Chapter $chapter */
37 $chapter = $this->start()
40 ->whereHas('book', function (Builder $query) use ($bookSlug) {
41 $query->where('slug', '=', $bookSlug);
43 ->where('slug', '=', $chapterSlug)
46 if (is_null($chapter)) {
47 throw new NotFoundException(trans('errors.chapter_not_found'));
53 public function usingSlugs(string $bookSlug, string $chapterSlug): Builder
56 ->where('slug', '=', $chapterSlug)
57 ->whereHas('book', function (Builder $query) use ($bookSlug) {
58 $query->where('slug', '=', $bookSlug);
62 public function visibleForList(): Builder
66 ->select(array_merge(static::$listAttributes, ['book_slug' => function ($builder) {
67 $builder->select('slug')
68 ->from('entities as books')
69 ->where('type', '=', 'book')
70 ->whereColumn('books.id', '=', 'entities.book_id');
74 public function visibleForContent(): Builder
76 return $this->start()->scopes('visible');