start()->scopes('visible')->find($id); } public function findVisibleByIdOrFail(int $id): Page { $page = $this->findVisibleById($id); if (is_null($page)) { throw new NotFoundException(trans('errors.page_not_found')); } return $page; } public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Page { /** @var ?Page $page */ $page = $this->start()->with('book') ->whereHas('book', function (Builder $query) use ($bookSlug) { $query->where('slug', '=', $bookSlug); }) ->where('slug', '=', $pageSlug) ->first(); if (is_null($page)) { throw new NotFoundException(trans('errors.chapter_not_found')); } return $page; } public function visibleForList(): Builder { return $this->start() ->select(array_merge(Page::$listAttributes, ['book_slug' => function ($builder) { $builder->select('slug') ->from('books') ->whereColumn('books.id', '=', 'pages.book_id'); }])); } public function currentUserDraftsForList(): Builder { return $this->visibleForList() ->where('draft', '=', true) ->where('created_by', '=', user()->id); } public function visibleTemplates(): Builder { return $this->visibleForList() ->where('template', '=', true); } }