mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-11-25 17:57:28 +08:00
a70ed81908
Removes page/chpater addSelect global query, to load book slug, and instead extracts base queries to be managed in new static class, while updating specific entitiy relation loading to use our more efficient MixedEntityListLoader where appropriate. Related to #4823
67 lines
1.7 KiB
PHP
67 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace BookStack\Entities\Models;
|
|
|
|
use BookStack\References\ReferenceUpdater;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
|
|
/**
|
|
* Class BookChild.
|
|
*
|
|
* @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
|
|
{
|
|
/**
|
|
* 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)
|
|
{
|
|
return $query->with('book')
|
|
->whereHas('book', function (Builder $query) use ($bookSlug) {
|
|
$query->where('slug', '=', $bookSlug);
|
|
})
|
|
->where('slug', '=', $childSlug);
|
|
}
|
|
|
|
/**
|
|
* Get the book this page sits in.
|
|
*/
|
|
public function book(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Book::class)->withTrashed();
|
|
}
|
|
|
|
/**
|
|
* Change the book that this entity belongs to.
|
|
*/
|
|
public function changeBook(int $newBookId): Entity
|
|
{
|
|
$oldUrl = $this->getUrl();
|
|
$this->book_id = $newBookId;
|
|
$this->refreshSlug();
|
|
$this->save();
|
|
$this->refresh();
|
|
|
|
if ($oldUrl !== $this->getUrl()) {
|
|
app()->make(ReferenceUpdater::class)->updateEntityReferences($this, $oldUrl);
|
|
}
|
|
|
|
// Update all child pages if a chapter
|
|
if ($this instanceof Chapter) {
|
|
foreach ($this->pages()->withTrashed()->get() as $page) {
|
|
$page->changeBook($newBookId);
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
}
|