ra3oul/eloquent-abstract-repository

laravel eloquent abstract repository to implement repository pattern in easy way

1.0 2016-06-15 09:02 UTC

This package is not auto-updated.

Last update: 2024-04-13 17:02:19 UTC


README

using repository pattern in laravel with a great base repository

Table of Contents

Installation

Composer

Execute the following command to get the latest version of the package:

composer require ra3oul/eloquent-abstract-repository -dev

Laravel

In your config/app.php add ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class to the end of the providers array:

'providers' => [
    ...

    ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class,
],

Methods

ra3oul\EloquentAbstractRepository\repository\RepositoryInterface

  • 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');

Usage

Create a Model

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',
        ...
     ];

     ...
}

Create a RepositoryInteface

namespace App;
use Foo ;
use ra3oul\EloquentAbstractRepository\repository\RepositoryInterface;

interface ArticleRepositoryInterface extends RepositoryInterface
{

}

Create a Repository

namespace App;
use Foo ;
class ArticleRepository extends AbstractEloquentRepository implements ArticleRepositoryInterface


       public function __construct(Foo $model)
    {
        parent::__construct($model);
    }
}

Create Service Provider

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

Use methods

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)