Rememberable é uma característica do Eloquent para Laravel que adiciona métodos de consulta remember()
. Isso torna muito fácil armazenar em cache os resultados da consulta por um período de tempo ajustável.
// Get a the first user's posts and remember them for a day.
User:: first ()-> remember ( now ()-> addDay ())-> posts ()-> get ();
// You can also pass the number of seconds if you like (before Laravel 5.8 this will be interpreted as minutes).
User:: first ()-> remember ( 60 * 60 * 24 )-> posts ()-> get ();
Funciona simplesmente lembrando a consulta SQL que foi usada e armazenando o resultado. Se a mesma consulta for tentada enquanto o cache persistir, ela será recuperada do armazenamento em vez de acessar seu banco de dados novamente.
Instale usando o Composer, assim como faria com qualquer outra coisa.
composer require watson/rememberable
A maneira mais fácil de começar a usar o Eloquent é criar um AppModel
abstrato a partir do qual você pode estender seus modelos de aplicação. Neste modelo base você pode importar a característica memorável que estenderá a mesma funcionalidade de cache para qualquer consulta que você construir a partir do seu modelo.
<?php
namespace App ;
use Watson Rememberable Rememberable ;
use Illuminate Database Eloquent Model as Eloquent ;
abstract class Model extends Eloquent
{
use Rememberable;
}
Agora, apenas certifique-se de que seu aplicativo seja modelado a partir deste novo AppModel
em vez do Eloquent.
<?php
namespace App ;
class Post extends Model
{
//
}
Alternativamente, você pode simplesmente aplicar a característica a cada modelo em que deseja usar remember()
.
Usar o método de lembrar é super simples. Basta passar o número de segundos que você deseja armazenar o resultado daquela consulta no cache, e sempre que a mesma consulta for chamada dentro desse período o resultado será retirado do cache, e não do banco de dados novamente.
// Remember the number of users for an hour.
$ users = User:: remember ( 60 * 60 )-> count ();
Se quiser marcar determinadas consultas, você pode adicionar cacheTags('tag_name')
à sua consulta. Observe que as tags de cache não são suportadas por todos os drivers de cache.
// Remember the number of users for an hour and tag it with 'user_queries'
User:: remember ( 60 * 60 )-> cacheTags ( ' user_queries ' )-> count ();
Se você quiser que um prefixo exclusivo seja adicionado à chave de cache para cada uma de suas consultas (por exemplo, se seu cache não suportar marcação), você poderá adicionar prefix('prefix')
à sua consulta.
// Remember the number of users for an hour and prefix the key with 'users'
User:: remember ( 60 * 60 )-> prefix ( ' users ' )-> count ();
Como alternativa, você pode adicionar a propriedade $rememberCachePrefix
ao seu modelo para sempre usar esse prefixo de cache.
Se você quiser usar um driver de cache personalizado (definido em config/cache.php), você pode adicionar cacheDriver('cacheDriver')
à sua consulta.
// Remember the number of users for an hour using redis as cache driver
User:: remember ( 60 * 60 )-> cacheDriver ( ' redis ' )-> count ();
Alternativamente, você pode adicionar a propriedade $rememberCacheDriver
ao seu modelo para sempre usar esse driver de cache.
Você pode definir uma tag de cache para todas as consultas de um modelo definindo a propriedade $rememberCacheTag
com uma string exclusiva que deve ser usada para marcar as consultas.
A validação funciona armazenando consultas em cache consulta por consulta. Isso significa que quando você executa o carregamento antecipado, essas consultas adicionais também não serão armazenadas em cache, a menos que seja explicitamente especificado. Você pode fazer isso usando um retorno de chamada com suas cargas antecipadas.
$ users = User:: where ( " id " , " > " , " 1 " )
-> with ([ ' posts ' => function ( $ q ) { $ q -> remember ( 60 * 60 ); }])
-> remember ( 60 * 60 )
-> take ( 5 )
-> get ();
Você pode optar por armazenar em cache todas as consultas de um modelo definindo a propriedade $rememberFor
com o número de segundos para os quais deseja armazenar os resultados em cache. Use esse recurso com cuidado, pois ele pode levar a um comportamento inesperado e a dados obsoletos em seu aplicativo se você não estiver familiarizado com seu funcionamento.
Com base na arquitetura do pacote não é possível excluir o cache para uma única consulta. Mas se você marcou alguma consulta usando tags de cache, poderá liberar o cache da tag:
User:: flushCache ( ' user_queries ' );
Se você usou a propriedade $rememberCacheTag
você pode usar o método sem parâmetro e os caches da tag definida por $rememberCacheTag
serão liberados:
User:: flushCache ();
Se precisar desabilitar o cache para uma consulta específica, você pode usar o método dontRemember
:
User:: latest ()-> dontRemember ()-> get ();