Rememberable — это черта Eloquent для Laravel, которая добавляет методы запроса remember()
. Это позволяет очень легко кэшировать результаты запроса на регулируемый период времени.
// 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 ();
Он работает, просто запоминая использованный SQL-запрос и сохраняя результат. Если тот же запрос будет предпринят во время сохранения кеша, он будет получен из хранилища вместо повторного обращения к вашей базе данных.
Установите с помощью Composer, как и все остальное.
composer require watson/rememberable
Самый простой способ начать работу с Eloquent — создать абстрактную модель AppModel
, из которой вы сможете расширять свои модели приложений. В эту базовую модель вы можете импортировать запоминаемый признак, который расширит ту же функциональность кэширования на любые запросы, которые вы строите на основе своей модели.
<?php
namespace App ;
use Watson Rememberable Rememberable ;
use Illuminate Database Eloquent Model as Eloquent ;
abstract class Model extends Eloquent
{
use Rememberable;
}
Теперь просто убедитесь, что ваши модели приложений основаны на этой новой AppModel
а не на Eloquent.
<?php
namespace App ;
class Post extends Model
{
//
}
В качестве альтернативы вы можете просто применить этот признак к каждой модели, в которой хотите использовать remember()
.
Использовать метод запоминания очень просто. Просто укажите количество секунд, в течение которых вы хотите сохранить результат этого запроса в кеше, и всякий раз, когда тот же запрос вызывается в течение этого периода времени, результат будет извлечен из кеша, а не снова из базы данных.
// Remember the number of users for an hour.
$ users = User:: remember ( 60 * 60 )-> count ();
Если вы хотите пометить определенные запросы, вы можете добавить к вашему запросу cacheTags('tag_name')
. Обратите внимание, что теги кэша поддерживаются не всеми драйверами кэша.
// Remember the number of users for an hour and tag it with 'user_queries'
User:: remember ( 60 * 60 )-> cacheTags ( ' user_queries ' )-> count ();
Если вы хотите, чтобы к ключу кэша для каждого вашего запроса добавлялся уникальный префикс (скажем, если ваш кеш не поддерживает тегирование), вы можете добавить prefix('prefix')
к вашему запросу.
// Remember the number of users for an hour and prefix the key with 'users'
User:: remember ( 60 * 60 )-> prefix ( ' users ' )-> count ();
Альтернативно вы можете добавить в модель свойство $rememberCachePrefix
, чтобы всегда использовать этот префикс кэша.
Если вы хотите использовать собственный драйвер кэша (определенный в config/cache.php), вы можете добавить в свой cacheDriver('cacheDriver')
.
// Remember the number of users for an hour using redis as cache driver
User:: remember ( 60 * 60 )-> cacheDriver ( ' redis ' )-> count ();
Альтернативно вы можете добавить в свою модель свойство $rememberCacheDriver
, чтобы всегда использовать этот драйвер кэша.
Вы можете установить тег кэша для всех запросов модели, задав для свойства $rememberCacheTag
уникальную строку, которая должна использоваться для тегирования запросов.
Проверка работает путем кэширования запросов по каждому запросу. Это означает, что при активной загрузке эти дополнительные запросы также не будут кэшироваться, если это явно не указано. Вы можете сделать это, используя обратный вызов с вашими нетерпеливыми нагрузками.
$ users = User:: where ( " id " , " > " , " 1 " )
-> with ([ ' posts ' => function ( $ q ) { $ q -> remember ( 60 * 60 ); }])
-> remember ( 60 * 60 )
-> take ( 5 )
-> get ();
Вы можете выбрать кэширование всех запросов модели, задав для свойства $rememberFor
количество секунд, в течение которых вы хотите кэшировать результаты. Используйте эту функцию с осторожностью, поскольку она может привести к неожиданному поведению и устаревшим данным в вашем приложении, если вы не знакомы с тем, как она работает.
В зависимости от архитектуры пакета невозможно удалить кеш для одного запроса. Но если вы пометили какие-либо запросы с помощью тегов кеша, вы можете очистить кеш для тега:
User:: flushCache ( ' user_queries ' );
Если вы использовали свойство $rememberCacheTag
вы можете использовать метод без параметра, и кэши для тега, установленного $rememberCacheTag
будут очищены:
User:: flushCache ();
Если вам нужно отключить кеш для определенного запроса, вы можете использовать метод dontRemember
:
User:: latest ()-> dontRemember ()-> get ();