queryBuilder = $source::query(); $model = new $source(); } elseif (is_object($source)) { $this->queryBuilder = $source; $model = $source->getModel(); } else { throw new Exception(message: "source is not valid"); } $this->options = $options; $this->currentPage = $this->options['currentPage'] ?? 1; $this->perPage = $this->options['perPage'] ?? 10; $this->meta['total'] = $model->count(); $this->meta['totalWithFilters'] = $this->queryBuilder->count(); $this->meta['columns'] = $options['columns'] ?? $model->labels(); $this->meta['perPage'] = $options['perPage'] ?? 10; $this->meta['currentPage'] = $options['currentPage'] ?? 1; $this->meta['baseUrl'] = $options['baseUrl'] ?? $model->table; $this->meta['params'] = $options['params'] ?? []; $this->meta['actions'] = $options['actions'] ?? []; $this->createQuery(); $this->jsonStr = (new JSONCreator($this->meta, $this->getCollection()->toArray()))->getJson(); } public function createQuery(): void { if ($this->currentPage > 1) { $this->queryBuilder->skip(($this->currentPage - 1) * $this->perPage)->take($this->perPage); } else { $this->queryBuilder->take($this->perPage); } } public function getCollection() { return $this->queryBuilder->get(); } /** * @return string|null */ public function getJson(): string|null { return $this->jsonStr; } }