*/ protected array $items; /** * Constructor of Relation Class */ public function __construct(string $name, ?Builder $builder = null) { $this->name = $name; $this->builder = $builder ?: new Builder($this->builder->connection); } /** * Load related items * * @return array */ public function load(): array { $loadedItems = $this->loadedItemsDictionary(); return array_map(function ($item) use (&$loadedItems) { $item->{$this->name} = $this->getItemFromDictionary($loadedItems, $item); return $item; }, $this->items); } /** * Loaded items with under its foreign key * * @return array */ abstract protected function loadedItemsDictionary(): array; /** * Get mapped value from the dictionary * * @param array $loadedItems * @return object|null | array */ abstract protected function getItemFromDictionary(array $loadedItems, object $item); /** * Set items of record * * @param array $items * @return $this */ public function setItems(array $items): Relation { $this->items = $items; return $this; } /** * Handle dynamic methods call of query builder * * @param array $arguments * @return Builder */ public function __call(string $name, array $arguments) { if ($name === 'get') { self::throwBadMethodCallException($name); } return self::forwardCallTo($this->builder, $name, $arguments); } /** * Get loaded items * * @return array */ abstract protected function getLoadedItems(): array; }