###This package is abandoned and no longer maintained. The author suggests using the https://github.com/andersao/l5-repository package instead.
Laravel 4 Repositories is used to abstract the data layer, making our application more flexible to maintain.
Add this line "prettus/laravel-repository": "2.0.*" in your composer.json.
"require": {
"prettus/laravel-repository": "2.0.*"
}
Issue composer update
Add to app/config/app.php service provider array:
'Prettus\Repository\RepositoryServiceProvider',
Publish Configuration
php artisan config:publish prettus/laravel-repository
- scopeReset()
- find($id, $columns = ['*'])
- findByField($field, $value, $columns = ['*'])
- all($columns = array('*'))
- paginate($limit = null, $columns = ['*'])
- create(array $attributes)
- update(array $attributes, $id)
- delete($id)
- getModel()
- with(array $relations);
- pushCriteria(Criteria $criteria)
- getCriteria()
- getByCriteria(Criteria $criteria)
- skipCriteria()
- apply($query)
Create your model normally , but it is important to define the attributes that can be filled from the input form data.
class Post extends Eloquent { // or Ardent, Or any other Model Class
protected $fillable = [
'title',
'author',
...
];
...
}
use Prettus\Repository\Eloquent\Repository;
class PostRepository extends Repository {
public function __construct(Post $model)
{
parent::__construct($model);
}
}
class PostsController extends BaseController {
/**
* @var PostRepository
*/
protected $repository;
public function __construct(PostRepository $repository){
$this->repository = $repository;
}
....
}
Find all results in Repository
$posts = $this->repository->all();
Find all results in Repository with pagination
$posts = $this->repository->paginate($limit = null, $columns = ['*']);
Find by result by id
$post = $this->repository->find($id);
Create new entry in Repository
$post = $this->repository->create( Input::all() );
Update entry in Repository
$post = $this->repository->update( Input::all(), $id );
Delete entry in Repository
$this->repository->delete($id)
Criteria is a way to change the repository of the query by applying specific conditions according to their need . You can add multiple Criteria in your repository
class MyCriteria implements \Prettus\Repository\Contracts\Criteria {
public function apply($query)
{
$query = $query->where('user_id','=', Auth::user()->id );
return $query;
}
}
class PostsController extends BaseController {
/**
* @var PostRepository
*/
protected $repository;
public function __construct(PostRepository $repository){
$this->repository = $repository;
}
public function index()
{
$this->repository->pushCriteria(new MyCriteria());
$posts = $this->repository->all();
...
}
}
Getting results from criteria
$posts = $this->repository->getByCriteria(new MyCriteria());
Setting Criteria default in Repository
use Prettus\Repository\Eloquent\Repository;
class PostRepository extends Repository {
public function __construct(Post $model)
{
parent::__construct($model);
}
public function boot(){
$this->pushCriteria(new MyCriteria());
$this->pushCriteria(new AnotherCriteria());
...
}
}
Use skipCriteria before any method in the repository
$posts = $this->repository->skipCriteria()->all();
RequestCriteria is a standard Criteria implementation. It enables filters perform in the repository from parameters sent in the request.
You can perform a dynamic search , filtering the data and customize queries
To use the Criteria in your repository , you can add a new criteria in the boot method of your repository , or directly use in your controller , in order to filter out only a few requests
####Enabling in your Repository
use Prettus\Repository\Eloquent\Repository;
use Prettus\Repository\Criteria\RequestCriteria;
class PostRepository extends Repository {
/**
* @var array
*/
protected $fieldSearchable = [
'name',
'email'
];
public function __construct(Post $model)
{
parent::__construct($model);
}
public function boot(){
$this->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
...
}
}
Remember, you need to define which fields from the model can are searchable.
In your repository set $fieldSearchable with their fields searchable.
protected $fieldSearchable = [
'name',
'email'
];
You can set the type of condition will be used to perform the query , the default condition is "="
protected $fieldSearchable = [
'name'=>'like',
'email', // Default Condition "="
'your_field'=>'condition'
];
####Enabling in your Controller
public function index()
{
$this->repository->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
$posts = $this->repository->all();
...
}
Request all data without filter by request
[
{
"id": 1,
"name": "Anderson Andrade",
"email": "[email protected]",
"created_at": "-0001-11-30 00:00:00",
"updated_at": "-0001-11-30 00:00:00"
},
{
"id": 2,
"name": "Lorem Ipsum",
"email": "[email protected]",
"created_at": "-0001-11-30 00:00:00",
"updated_at": "-0001-11-30 00:00:00"
},
{
"id": 3,
"name": "Laravel",
"email": "[email protected]",
"created_at": "-0001-11-30 00:00:00",
"updated_at": "-0001-11-30 00:00:00"
}
]
Conducting research in the repository
http://prettus.local/users?search=Anderson%20Andrade
or
http://prettus.local/users?search=Anderson&searchFields=name:like
or
http://prettus.local/[email protected]&searchFields=email:=
[
{
"id": 1,
"name": "Anderson Andrade",
"email": "[email protected]",
"created_at": "-0001-11-30 00:00:00",
"updated_at": "-0001-11-30 00:00:00"
}
]
Filtering fields
http://prettus.local/users?filter=id;name
[
{
"id": 1,
"name": "Anderson Andrade"
},
{
"id": 2,
"name": "Lorem Ipsum"
},
{
"id": 3,
"name": "Laravel"
}
]
Sorting the results
http://prettus.local/users?filter=id;name&orderBy=id&sortedBy=desc
[
{
"id": 3,
"name": "Laravel"
},
{
"id": 2,
"name": "Lorem Ipsum"
},
{
"id": 1,
"name": "Anderson Andrade"
}
]
####Overwrite params name
You can change the name of the parameters in the configuration file config/repository-criteria.php
Anderson Andrade - [email protected]