【发布时间】:2017-07-05 17:49:07
【问题描述】:
我已经创建了一个基础存储库,现在正在扩展它以添加缓存,但我遇到的问题似乎比大多数人都多的是pagination
在我的 all() 方法中,我在不缓存的情况下执行以下操作:
public function all($pagination = 20)
{
try
{
$query = $this->model->newQuery();
return $this->handlePagination($query, $pagination);
}
catch (Exception $e)
{
throw $e;
}
}
protected function handlePagination($query, $pagination)
{
if (is_null($pagination))
{
return $query;
}
$collection = $query->paginate($pagination);
return $collection;
}
这很好,但是当我尝试实现缓存时,我想单独缓存每个模型并存储每个集合的键,因此,如果我对所有条目进行分页,我会将每个分页集合存储在缓存:
cache set.1 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
cache set.2 [21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]
等等……
问题是似乎不可能使用实际的分页类来返回结果,因为您只分页id
我可以分别返回数据和分页器,但这看起来很hacky。
有没有办法用模型数据重新填充Paginator 类而不覆盖整个内容?
编辑
我在想这样的事情:
public function all($pagination = 20)
{
try
{
$cache_key = $this->cache_key . '.all';
$ids = Cache::get($cache_key);
if (! $ids)
{
$query = $this->model->newQuery();
$ids = $query->pluck('id');
Cache::put($cache_key, $ids, $this->cache_ttl);
}
$ids = $this->handlePagination($ids, $pagination);
$collection = new Collection();
foreach ($ids as $id)
{
if ($model = $this->find($id))
{
$collection->put($id, $model);
}
}
return $collection;
}
catch (Exception $e)
{
throw $e;
}
}
/**
* @var \Illuminate\Pagination\Paginator
*/
protected $paginator;
public function handlePagination($array, $pagination = 20)
{
if (!is_null($pagination))
{
$this->paginator = Paginator::make($array, count($array), $pagination);
return $this->paginator->getItems();
}
return $array;
}
public function getPaginator()
{
return $this->paginator;
}
【问题讨论】:
标签: php caching pagination laravel-4