@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();
}
}