Last active
June 2, 2022 21:34
-
-
Save enmanuel97/6999a887229a8707859206a5ab93a350 to your computer and use it in GitHub Desktop.
BaseRepository.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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