Optimized loading of page/chapter URLs to be a little more efficient

- Loaded book_slug as part of chapter/page queries instead of books
 being loaded in afterwards.
- Removed unused page method.
- Updated some page queries to load specific attributes.
This commit is contained in:
Dan Brown 2021-08-21 19:58:19 +01:00
parent 8db047de70
commit 1a6293ce24
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
5 changed files with 26 additions and 21 deletions

View File

@ -10,14 +10,29 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
*
* @property int $book_id
* @property int $priority
* @property string $book_slug
* @property Book $book
*
* @method Builder whereSlugs(string $bookSlug, string $childSlug)
*/
abstract class BookChild extends Entity
{
protected static function boot()
{
parent::boot();
// Load book slugs onto these models by default during query-time
static::addGlobalScope('book_slug', function(Builder $builder) {
$builder->addSelect(['book_slug' => function($builder) {
$builder->select('slug')
->from('books')
->whereColumn('books.id', '=', 'book_id');
}]);
});
}
/**
* Scope a query to find items where the the child has the given childSlug
* Scope a query to find items where the child has the given childSlug
* where its parent has the bookSlug.
*/
public function scopeWhereSlugs(Builder $query, string $bookSlug, string $childSlug)

View File

@ -36,7 +36,7 @@ class Chapter extends BookChild
{
$parts = [
'books',
urlencode($this->getAttribute('bookSlug') ?? $this->book->slug),
urlencode($this->book_slug ?? $this->book->slug),
'chapter',
urlencode($this->slug),
trim($path, '/'),

View File

@ -25,9 +25,10 @@ use Permissions;
*/
class Page extends BookChild
{
protected $fillable = ['name', 'priority', 'markdown'];
public static $listAttributes = ['name', 'id', 'slug', 'book_id', 'text', 'created_at', 'updated_at'];
public static $contentAttributes = ['name', 'id', 'slug', 'book_id', 'html', 'text', 'created_at', 'updated_at'];
protected $simpleAttributes = ['name', 'id', 'slug'];
protected $fillable = ['name', 'priority', 'markdown'];
public $textField = 'text';
@ -48,19 +49,6 @@ class Page extends BookChild
return parent::scopeVisible($query);
}
/**
* Converts this page into a simplified array.
*
* @return mixed
*/
public function toSimpleArray()
{
$array = array_intersect_key($this->toArray(), array_flip($this->simpleAttributes));
$array['url'] = $this->getUrl();
return $array;
}
/**
* Get the chapter that this page is in, If applicable.
*
@ -119,7 +107,7 @@ class Page extends BookChild
{
$parts = [
'books',
urlencode($this->getAttribute('bookSlug') ?? $this->book->slug),
urlencode($this->book_slug ?? $this->book->slug),
$this->draft ? 'draft' : 'page',
$this->draft ? $this->id : urlencode($this->slug),
trim($path, '/'),

View File

@ -93,9 +93,11 @@ class BookContents
/**
* Get the visible pages within this book.
*/
protected function getPages(bool $showDrafts = false): Collection
protected function getPages(bool $showDrafts = false, bool $getPageContent = false): Collection
{
$query = Page::visible()->where('book_id', '=', $this->book->id);
$query = Page::visible()
->select($getPageContent ? Page::$contentAttributes : Page::$listAttributes)
->where('book_id', '=', $this->book->id);
if (!$showDrafts) {
$query->where('draft', '=', false);

View File

@ -10,7 +10,6 @@ use BookStack\Entities\Queries\TopFavourites;
use BookStack\Entities\Repos\BookRepo;
use BookStack\Entities\Repos\BookshelfRepo;
use BookStack\Entities\Tools\PageContent;
use Views;
class HomeController extends Controller
{
@ -41,6 +40,7 @@ class HomeController extends Controller
->where('draft', false)
->orderBy('updated_at', 'desc')
->take($favourites->count() > 0 ? 6 : 12)
->select(Page::$listAttributes)
->get();
$homepageOptions = ['default', 'books', 'bookshelves', 'page'];