2021-06-26 11:23:15 -04:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Entities\Models;
|
2019-09-19 19:18:28 -04:00
|
|
|
|
2022-08-21 13:05:19 -04:00
|
|
|
use BookStack\References\ReferenceUpdater;
|
2019-10-05 07:55:01 -04:00
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
2019-09-19 19:18:28 -04:00
|
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
|
|
|
|
|
|
/**
|
2021-06-26 11:23:15 -04:00
|
|
|
* Class BookChild.
|
|
|
|
*
|
2021-08-24 16:23:55 -04:00
|
|
|
* @property int $book_id
|
|
|
|
* @property int $priority
|
|
|
|
* @property string $book_slug
|
|
|
|
* @property Book $book
|
2021-06-26 11:23:15 -04:00
|
|
|
*
|
2019-10-05 07:55:01 -04:00
|
|
|
* @method Builder whereSlugs(string $bookSlug, string $childSlug)
|
2019-09-19 19:18:28 -04:00
|
|
|
*/
|
2020-11-21 18:20:54 -05:00
|
|
|
abstract class BookChild extends Entity
|
2019-09-19 19:18:28 -04:00
|
|
|
{
|
2021-08-21 14:58:19 -04:00
|
|
|
protected static function boot()
|
|
|
|
{
|
|
|
|
parent::boot();
|
|
|
|
|
|
|
|
// Load book slugs onto these models by default during query-time
|
2021-08-24 16:23:55 -04:00
|
|
|
static::addGlobalScope('book_slug', function (Builder $builder) {
|
|
|
|
$builder->addSelect(['book_slug' => function ($builder) {
|
2021-08-21 14:58:19 -04:00
|
|
|
$builder->select('slug')
|
|
|
|
->from('books')
|
2021-08-24 16:23:55 -04:00
|
|
|
->whereColumn('books.id', '=', 'book_id');
|
2021-08-21 14:58:19 -04:00
|
|
|
}]);
|
|
|
|
});
|
|
|
|
}
|
2021-08-24 16:23:55 -04:00
|
|
|
|
2019-10-05 07:55:01 -04:00
|
|
|
/**
|
2021-08-21 14:58:19 -04:00
|
|
|
* Scope a query to find items where the child has the given childSlug
|
2019-10-05 07:55:01 -04:00
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
|
2019-09-19 19:18:28 -04:00
|
|
|
/**
|
|
|
|
* Get the book this page sits in.
|
|
|
|
*/
|
|
|
|
public function book(): BelongsTo
|
|
|
|
{
|
2021-01-03 17:29:58 -05:00
|
|
|
return $this->belongsTo(Book::class)->withTrashed();
|
2019-09-19 19:18:28 -04:00
|
|
|
}
|
|
|
|
|
2019-10-05 07:55:01 -04:00
|
|
|
/**
|
|
|
|
* Change the book that this entity belongs to.
|
|
|
|
*/
|
|
|
|
public function changeBook(int $newBookId): Entity
|
|
|
|
{
|
2022-08-21 13:05:19 -04:00
|
|
|
$oldUrl = $this->getUrl();
|
2019-10-05 07:55:01 -04:00
|
|
|
$this->book_id = $newBookId;
|
|
|
|
$this->refreshSlug();
|
|
|
|
$this->save();
|
2022-08-30 17:12:52 -04:00
|
|
|
$this->refresh();
|
2022-08-21 13:05:19 -04:00
|
|
|
|
|
|
|
if ($oldUrl !== $this->getUrl()) {
|
|
|
|
app()->make(ReferenceUpdater::class)->updateEntityPageReferences($this, $oldUrl);
|
|
|
|
}
|
|
|
|
|
2019-10-05 07:55:01 -04:00
|
|
|
// Update all child pages if a chapter
|
|
|
|
if ($this instanceof Chapter) {
|
2021-03-13 10:18:37 -05:00
|
|
|
foreach ($this->pages()->withTrashed()->get() as $page) {
|
2019-10-05 07:55:01 -04:00
|
|
|
$page->changeBook($newBookId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
}
|