@php echo "makeModel(); } /** * Get searchable fields array */ abstract public function getFieldsSearchable(): array; /** * Configure the Model */ abstract public function model(): string; /** * Make Model instance * * @throws \Exception * * @return Model */ public function makeModel() { $model = app($this->model()); if (!$model instanceof Model) { throw new \Exception("Class {$this->model()} must be an instance of Illuminate\\Database\\Eloquent\\Model"); } return $this->model = $model; } /** * Paginate records for scaffold. */ public function paginate(int $perPage, array $columns = ['*']): LengthAwarePaginator { $query = $this->allQuery(); return $query->paginate($perPage, $columns); } /** * Build a query for retrieving all records. */ public function allQuery(array $search = [], int $skip = null, int $limit = null): Builder { $query = $this->model->newQuery(); if (count($search)) { foreach($search as $key => $value) { if (in_array($key, $this->getFieldsSearchable())) { $query->where($key, $value); } } } if (!is_null($skip)) { $query->skip($skip); } if (!is_null($limit)) { $query->limit($limit); } return $query; } /** * Retrieve all records with given filter criteria */ public function all(array $search = [], int $skip = null, int $limit = null, array $columns = ['*']): Collection { $query = $this->allQuery($search, $skip, $limit); return $query->get($columns); } /** * Create model record */ public function create(array $input): Model { $model = $this->model->newInstance($input); $model->save(); return $model; } /** * Find model record for given id * * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|Model|null */ public function find(int $id, array $columns = ['*']) { $query = $this->model->newQuery(); return $query->find($id, $columns); } /** * Update model record for given id * * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|Model */ public function update(array $input, int $id) { $query = $this->model->newQuery(); $model = $query->findOrFail($id); $model->fill($input); $model->save(); return $model; } /** * @throws \Exception * * @return bool|mixed|null */ public function delete(int $id) { $query = $this->model->newQuery(); $model = $query->findOrFail($id); return $model->delete(); } }