Simple to use Caching Repository for Laravel Eloquent
drapor/cache-repository is a Laravel package for simple to use caching repository for laravel eloquent.
It currently has 12 GitHub stars and 501 downloads on Packagist (latest version 1.0.6).
Install it with composer require drapor/cache-repository.
Discover more Laravel packages by drapor
or browse all Laravel packages to compare alternatives.
Last updated
This laravel package gives a fluid way to cache your queries while speeding up your Eloquent workflow.
Install the composer package
composer require "drapor/cache-repository"Add the service Provider to your app.php
'Drapor\CacheRepository\CacheRepositoryServiceProvider'Publish the config
` php artisan vendor:publish `Step 1 : Modify our Model
<?php namespace app\Models;
use Drapor\CacheRepository\Eloquent\BaseModel;
class User extends BaseModel
{ ... }
?>
Step 2: Create a Repository Class
<?php namespace app\Repositories;
use Drapor\CacheRepository\CacheRepository;
class UserRepository extends CacheRepository
{
public function __construct(User $user)
{
parent::__construct($user, 'user');
//Create a Relation instance and pass the second argument as a boolean
//indicating wether or not it should be removed from the cache when the User object is updated.
$task = new Relation('task',true);
//Only call $this->setRelations() if you wish to eager load these relations before every call. This method accepts both
//instances of Relation and strings.
$this->setRelations([
'group', $task
]);
}
}
Now You can Inject the Repository wherever you need to use it. This can be done in quite a few ways due to Laravel's magic, but we're going to keep it simple and use a common example.
Step 3 : Inject The Repo
<?php namespace app/controllers;
use Repositories/UserRepository;
use Request;
class UserController extends Controller
{
protected $repository;
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
public function index()
{
$limit = Request::input('limit');
$users = $this->repository
->orderBy('name','ASC')
->paginate($limit);
return response()->json($users);
}
public function getSadUsers()
{
$limit = Request::input('limit');
//Paginate accepts a second argument for search parameters.
//This should be an array of arrays, each with at least a key and a value.
$params = [
[
'key' => 'sad',
'value' => 'true'
],
[
'key' => 'happiness',
'operator' => '<',
'value' => '2',
'keyword' => 'AND'
]
];
//Alternatively you can call Argument::extract(Request::input(),'search')
//and any search information will automatically be formatted
$users = $this->repository
->with('equity','orders')
->paginate($limit,$params);
return response()->json($users->toJson());
}
public function find($id)
{
$user = $this->repository->with('tasks')->find($id);
return response()->json($user->toJson());
}
public function update($id)
{
//The Repository class will automatically clean out any input
//that isn't fillable by our model.
$user = $this->repository->update($id,Request::input());
return response()->json($user->toJson());
}
}
$user = $this->repository->noCache()->find($id);
or by using the PlainRepository class instead.
paginate() method are not cached at this time. If you wish to cache a collection, you should use the whereCached() method directly from your Repository
setCacheLifeTime() before any method
$books = $this->respository
->with('books')
->whereCached('name','harry-potter')->
->transformTo(BookTransformer::class);
The do-whatever-you-want-with-it attributation