Repositories/Eloquent/EloquentBaseRepository.php
<?php namespace Modules\Core\Repositories\Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Modules\Core\Repositories\BaseRepository;
/**
* Class EloquentCoreRepository
*
* @package Modules\Core\Repositories\Eloquent
*/
abstract class EloquentBaseRepository implements BaseRepository
{
/**
* @var \Illuminate\Database\Eloquent\Model An instance of the Eloquent Model
*/
protected $model;
/**
* @param Model $model
*/
public function __construct($model)
{
$this->model = $model;
}
/**
* @param int $id
* @return object
*/
public function find($id)
{
if (method_exists($this->model, 'translations')) {
return $this->model->with('translations')->find($id);
}
return $this->model->find($id);
}
/**
* @return \Illuminate\Database\Eloquent\Collection
*/
public function all()
{
if (method_exists($this->model, 'translations')) {
return $this->model->with('translations')->orderBy('created_at', 'DESC')->get();
}
return $this->model->orderBy('created_at', 'DESC')->get();
}
/**
* @param mixed $data
* @return object
*/
public function create($data)
{
return $this->model->create($data);
}
/**
* @param $model
* @param array $data
* @return object
*/
public function update($model, $data)
{
$model->update($data);
return $model;
}
/**
* @param Model $model
* @return bool
*/
public function destroy($model)
{
return $model->delete();
}
/**
* Return all resources in the given language
*
* @param string $lang
* @return \Illuminate\Database\Eloquent\Collection
*/
public function allTranslatedIn($lang)
{
return $this->model->whereHas('translations', function (Builder $q) use ($lang) {
$q->where('locale', "$lang");
})->with('translations')->orderBy('created_at', 'DESC')->get();
}
/**
* Find a resource by the given slug
*
* @param string $slug
* @return object
*/
public function findBySlug($slug)
{
if (method_exists($this->model, 'translations')) {
return $this->model->whereHas('translations', function (Builder $q) use ($slug) {
$q->where('slug', $slug);
})->with('translations')->first();
}
return $this->model->where('slug', $slug)->first();
}
/**
* Find a resource by an array of attributes
* @param array $attributes
* @return object
*/
public function findByAttributes(array $attributes)
{
$query = $this->buildQueryByAttributes($attributes);
return $query->first();
}
/**
* Get resources by an array of attributes
* @param array $attributes
* @param null|string $orderBy
* @param string $sortOrder
* @return \Illuminate\Database\Eloquent\Collection
*/
public function getByAttributes(array $attributes, $orderBy = null, $sortOrder = 'asc')
{
$query = $this->buildQueryByAttributes($attributes, $orderBy, $sortOrder);
return $query->get();
}
/**
* Build Query to catch resources by an array of attributes and params
* @param array $attributes
* @param null|string $orderBy
* @param string $sortOrder
* @return \Illuminate\Database\Query\Builder object
*/
private function buildQueryByAttributes(array $attributes, $orderBy = null, $sortOrder = 'asc')
{
$query = $this->model->query();
if (method_exists($this->model, 'translations')) {
$query = $query->with('translations');
}
foreach ($attributes as $field => $value) {
$query = $query->where($field, $value);
}
if (null !== $orderBy) {
$query->orderBy($orderBy, $sortOrder);
}
return $query;
}
/**
* Return a collection of elements who's ids match
* @param array $ids
* @return mixed
*/
public function findByMany(array $ids)
{
$query = $this->model->query();
if (method_exists($this->model, 'translations')) {
$query = $query->with('translations');
}
return $query->whereIn("id", $ids)->get();
}
/**
* Clear the cache for this Repositories' Entity
* @return bool
*/
public function clearCache()
{
return true;
}
}