我創建了一個基礎庫,我現在擴展它來添加緩存,但問題我似乎遇到了比大多數是pagination
Laravel庫緩存和分頁
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
我可以返回數據和分頁程序但是這看起來很詭異。
有沒有辦法使用模型數據重新填充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;
}
非常有趣的類 - 它充分利用由口才給出的所有功能,併成功緩存的一切嗎? – azngunit81
到目前爲止,我們正在測試這個類。到目前爲止,我們沒有發現重大問題。但是你可以試試看看它是否有效。背後的想法是緩存一個對象和所有將獲取該對象的相關查詢。只要對象得到更新,我們就會使所有這些引用無效,以便緩存得到刷新。 – martin
將緩存嵌入到Eloquent模型中可能不是一個好主意。 Questioner使用了存儲庫設計模式,因此處理緩存的正確方法是存儲庫的緩存修飾器類。 – trm42