Skip to content

Instantly share code, notes, and snippets.

@enmanuel97
Last active June 2, 2022 21:34
Show Gist options
  • Save enmanuel97/6999a887229a8707859206a5ab93a350 to your computer and use it in GitHub Desktop.
Save enmanuel97/6999a887229a8707859206a5ab93a350 to your computer and use it in GitHub Desktop.
BaseRepository.php
<?php
namespace App\Repositories;
use Illuminate\Container\Container as Application;
use Illuminate\Database\Eloquent\Model;
abstract class BaseRepository
{
/**
* @var Model
*/
protected $model;
/**
* @var Application
*/
protected $app;
/**
* @param Application $app
* @throws \Exception
*/
public function __construct(Application $app)
{
$this->app = $app;
$this->makeModel();
}
/**
* Get searchable fields array
* @return array
*/
abstract public function getFieldsSearchable();
/**
* Configure the Model
* @return string
*/
abstract public function model();
/**
* Make Model instance
* @throws \Exception
* @return Model
*/
public function makeModel()
{
$model = $this->app->make($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.
* @param int $perPage
* @param array $columns
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function paginate($perPage, $columns = ['*'])
{
$query = $this->allQuery();
return $query->paginate($perPage, $columns);
}
/**
* Build a query for retrieving all records.
* @param array $search
* @param int|null $skip
* @param int|null $limit
* @return \Illuminate\Database\Eloquent\Builder
*/
public function allQuery($search = [], $skip = null, $limit = null)
{
$query = $this->model->newQuery();
$query->where('hidden', 0);
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
* @param array $search
* @param int|null $skip
* @param int|null $limit
* @param array $columns
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
*/
public function all($search = [], $skip = null, $limit = null, $columns = ['*'])
{
$query = $this->allQuery($search, $skip, $limit);
return $query->get($columns);
}
/**
* Create model record
* @param array $input
* @return Model
*/
public function create($input)
{
$model = $this->model->newInstance($input);
$model->save();
return $model;
}
/**
* Find model record for given id
* @param int $id
* @param array $columns
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|Model|null
*/
public function find($id, $columns = ['*'])
{
$query = $this->model->newQuery();
return $query->find($id, $columns)->where('hidden', 0);
}
/**
* Update model record for given id
* @param array $input
* @param int $id
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|Model
*/
public function update($input, $id)
{
$query = $this->model->newQuery();
$model = $query->findOrFail($id);
$model->fill($input);
$model->save();
return $model;
}
/**
* @param int $id
* @throws \Exception
* @return bool|mixed|null
*/
public function delete($id)
{
$query = $this->model->newQuery();
$model = $query->findOrFail($id);
return $model->update(['hidden' => 1]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment