cache php caching laravel laravel-4

laravel php cache clear



¿Cómo olvidarías los modelos Eloquent en caché en Laravel? (4)

Pregunta teórica sobre Laravel aquí.

Entonces, el ejemplo del almacenamiento en caché que haré es:

Article::with(''comments'')->remember(5)->get();

Idealmente, me gustaría tener un evento para actualizaciones de artículos que cuando se actualice el ID de una instancia de ese modelo (que ya está en caché), quiero olvidar esa clave (incluso si es el resultado de la consulta olvidada en lugar de solo esa instancia ejemplar), ¿es posible hacerlo?

Si no, ¿hay alguna forma de implementar esto de forma razonablemente limpia?


Actualmente no hay una manera fácil. Sin embargo, encontré esta solución, que hasta ahora funcionaba para mí.

Primero debe extender Illuminate/Database/Query/Builder .

<?php class ModifiedBuilder extends Illuminate/Database/Query/Builder { protected $forgetRequested = false; public function forget() { $this->forgetRequested = true; } public function getCached($columns = array(''*'')) { if (is_null($this->columns)) $this->columns = $columns; list($key, $minutes) = $this->getCacheInfo(); // If the query is requested ot be cached, we will cache it using a unique key // for this database connection and query statement, including the bindings // that are used on this query, providing great convenience when caching. $cache = $this->connection->getCacheManager(); $callback = $this->getCacheCallback($columns); if($this->forgetRequested) { $cache->forget($key); $this->forgetRequested = false; } return $cache->remember($key, $minutes, $callback); } }

Luego debe crear una nueva clase que amplíe el Modelo Eloquent.

<?php class BaseModel extends Eloquent { protected function newBaseQueryBuilder() { $conn = $this->getConnection(); $grammar = $conn->getQueryGrammar(); return new ModifiedBuilder($conn, $grammar, $conn->getPostProcessor()); } }

Ahora, cuando se crean Modelos Eloquent, en lugar de extender Modelos Eloquent amplía BaseModel recién creado.

Ahora puede remember resultado de la consulta como de costumbre.

YourModel::remember(10)->get();

Cuando desee descartar el resultado en caché, todo lo que tiene que hacer es

YourModel::forget()->get();

Si recuerda el resultado anteriormente, después de borrar el resultado almacenado en la memoria caché, el modelo continuará recordando el resultado durante ese período de tiempo.

Espero que esto ayude.


Así que estaba buscando una respuesta a la misma pregunta que OP pero no estaba realmente satisfecho con las soluciones. Así que empecé a jugar con esto recientemente y pasando por el código fuente del framework, descubrí que el método remember() acepta el segundo param llamado key y por alguna razón no se ha documentado en su site (¿o lo eché de menos? ?).

Ahora, lo bueno de esto es que, el generador de bases de datos utiliza el mismo controlador de caché que se configura en app/config/cache.php O debería decir el mismo sistema de caché que se ha documentado aquí? Cache . Entonces, si pasa min y key para remember() , puede usar la misma tecla para borrar el caché usando Cache::forget() método Cache::forget() y, de hecho, puede usar prácticamente todos los métodos de Cache listados en el Cache , como Cache::get() , Cache::add() , Cache::put() , etc. Pero no te recomiendo que uses esos otros métodos a menos que sepas lo que estás haciendo.

Aquí hay un ejemplo para que usted y otros entiendan lo que quiero decir.

Article::with(''comments'')->remember(5, ''article_comments'')->get();

Ahora el resultado de la consulta anterior se almacenará en la article_comments caché y se asociará con la clave article_comments que luego se puede usar para borrarla en cualquier momento (en mi caso, lo hago cuando actualizo).

Así que ahora si quiero borrar ese caché sin importar cuánto tiempo recuerde. Puedo hacerlo llamando a Cache::forget(''article_comments''); y debería funcionar como se esperaba.

Espero que esto ayude a todos :)


Creo que una buena manera de hacerlo es así:

$value = Cache::remember(''users'', $minutes, function() { return DB::table(''users'')->get(); });

y luego use Observadores de Modelos para detectar el evento de actualización del modelo

class UserObserver { public function saving($model) { // } public function saved($model) { // forget from cache Cache::forget(''users''); } } User::observe(new UserObserver);


Estaba probando el modo de depuración. Así que descubrí que si pones una prueba para app.debug en un constructor, puedes borrar el caché asociado a una clave. Le ahorra tener que duplicar el código para cada función.

class Events { public function __construct() { if (/Config::get(''app.debug'')) { Cache::forget(''events''); } } public static function all() { $events = /DB::table(''events as e'') ->select(''e.*'') ->where(''enabled'', 1) ->remember(30, ''events'') ->get(); return $events; } }