using repository pattern in laravel with a great base repository
Execute the following command to get the latest version of the package:
composer require ra3oul/eloquent-abstract-repository -dev
In your config/app.php
add
ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class
to the end of the providers
array:
'providers' => [
...
ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class,
],
- create($columns = array('*'))
- findOneById($id )
- findOneBy($key , $value )
- findManyBy($key,$value])
- findManyByIds($ids = array())
- findAll()
- findManyByCredentials($credentials = array())
- paginateBy($key, $value, $perPage = 10)
- paginate($perPage = 10)
- paginateByCredentials(array $credentials, $perPage = 10)
- updateOneById($id, array $data = [])
- updateOneBy($key, $value, array $data = [])
- updateOneByCredentials(array $credentials, array $data = []');
- updateManyBy($key, $value, array $data = []);
- updateManyByCredentials(array $credentials = [], array $data = []);
- updateManyByIds(array $ids, array $data = []);
- function deleteOneById($id);
- public function allExist(array $ids);
- deleteOneBy($key, $value);
- deleteOneByCredentials(array $credentials = []);
- deleteManyBy($key, $value);
- deleteManyByCredentials(array $credentials = []);
- deleteManyByIds(array $ids);
- searchByCredentials(array $credentials = [], $perPage);
- with(array $with = []);
- columns(array $columns = ['*']);
- limit($limit = 10);
- orderBy($orderBy, $sort = 'DESC');
Create your model normally, but it is important to define the attributes that can be filled from the input form data.
namespace App;
class Article extends Eloquent { // can be any other class name
protected $fillable = [
'name',
'author',
...
];
...
}
namespace App;
use Foo ;
use ra3oul\EloquentAbstractRepository\repository\RepositoryInterface;
interface ArticleRepositoryInterface extends RepositoryInterface
{
}
namespace App;
use Foo ;
class ArticleRepository extends AbstractEloquentRepository implements ArticleRepositoryInterface
public function __construct(Foo $model)
{
parent::__construct($model);
}
}
in order to bind interfaces to repository classes we should create a simple service provider to bind them
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
protected function registeredRepositories()
{
// 'Repository Interface' => 'Implementation'
return [
'\App\ArticleRepositoryInterface' =>
'\App\ArticleRepository',
// you should add other interfaces and their implemented classes below !
];
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$repos = $this->registeredRepositories();
foreach ($repos as $interface => $implemented) {
$this->app->bind($interface, $implemented);
}
}
namespace App\Http\Controllers;
use App\ArticleRepositoryInterface;
class ArticlesController extends BaseController {
/**
* @var ArticleRepository
*/
protected $repository;
public function __construct(FooRepositoryInterface $repository){
$this->repository = $repository;
}
....
}
Find all results in Repository
$articles = $this->repository->findAll();
Find all results in Repository with pagination
$aritcles = $this->repository->columns([*])->paginate($limit=10);
Find by result by id
$articles = $this->repository->findOneById($id);
Showing only specific attributes of the model
$article = $this->repository->columns(['id', 'state_id'])->findOneById($id);
Loading the Model relationships
$article = $this->repository->with(['state'])->findOneById($id);
Find by result by field name
$articles = $this->repository->findOneBy('country_id','15');
Find by result by field
$articles = $this->repository->findManyBy('name','rasoul');
Find by result by multiple values in id
$articles = $this->repository->findManyByIds([1,2,3,4,5]);
Create new entry in Repository
$article = $this->repository->create( Input::all() );
Update entry in Repository
$article = $this->repository->updateOneById( $id , Input::all());
Delete entry in Repository
$this->repository->deleteOneById($id)