*/
protected array $list = [];
- /**
- * Whether to include related titles in the response.
- */
- protected bool $includeRelatedTitles = false;
-
/**
* The fields to show in the formatted data.
* Can be a plain string array item for a direct model field (If existing on model).
/**
* Enable the inclusion of related book and chapter titles in the response.
*/
- public function withRelatedTitles(): self
+ public function withRelatedData(): self
{
- $this->includeRelatedTitles = true;
-
- $this->withField('book_title', function (Entity $entity) {
+ $this->withField('book', function (Entity $entity) {
if (method_exists($entity, 'book')) {
- return $entity->book?->name;
+ return $entity->book()->select(['id', 'name', 'slug'])->first();
}
return null;
});
- $this->withField('chapter_title', function (Entity $entity) {
+ $this->withField('chapter', function (Entity $entity) {
if ($entity instanceof Page && $entity->chapter_id) {
- return optional($entity->getAttribute('chapter'))->name;
+ return $entity->chapter()->select(['id', 'name', 'slug'])->first();
}
return null;
});
*/
public function format(): array
{
+ $this->loadRelatedData();
+
$results = [];
foreach ($this->list as $item) {
return $results;
}
+ /**
+ * Eager load the related book and chapter data when needed.
+ */
+ protected function loadRelatedData(): void
+ {
+ $pages = collect($this->list)->filter(fn($item) => $item instanceof Page);
+
+ foreach ($this->list as $entity) {
+ if (method_exists($entity, 'book')) {
+ $entity->load('book');
+ }
+ if ($entity instanceof Page && $entity->chapter_id) {
+ $entity->load('chapter');
+ }
+ }
+ }
+
/**
* Format a single entity item to a plain array.
*/