让 Laravel 5 数据模型支持 remember () 方法
在使用前后端分离的时候,通常都会遇到这么一个问题,比方说首页进入的时候会调用 N 个接口,这 N 个接口都会去查询数据库中的用户表数据,会导致查询了 N 次。
查阅资料后发现大致有以下方法实现:
- MySQL 的 Query Cache
- Eloquent 里面使用 Cache
这边主要使用了第二种方案,因为有现成的 packagist。
安装
使用 Composer 进行安装。
composer require watson/rememberable
使用
在 User.php
引入 use Rememberable
<?php
namespace App;
class User extends Model
{
use Rememberable;
}
在业务逻辑里面使用
# 缓存1分钟用户信息。
$users = User::remember(now()->addSeconds(60))->first();
那如何解决 N 个接口,查询 N 次问题?
User.php
namespace App;
class User extends Model
{
use Rememberable;
protected $rememberFor = 10; // 默认缓存10分钟,慎用!!!
}
主要代码实现:Rememberable.php
<?php
namespace Watson\Rememberable;
use Watson\Rememberable\Query\Builder;
trait Rememberable
{
/**
* Get a new query builder instance for the connection.
*
* @return \Illuminate\Database\Query\Builder
*/
protected function newBaseQueryBuilder()
{
$conn = $this->getConnection();
$grammar = $conn->getQueryGrammar();
$builder = new Builder($conn, $grammar, $conn->getPostProcessor());
# 默认存储时间
if (isset($this->rememberFor)) {
$builder->remember($this->rememberFor);
}
# 默认缓存标签
if (isset($this->rememberCacheTag)) {
$builder->cacheTags($this->rememberCacheTag);
}
# 默认缓存前缀
if (isset($this->rememberCachePrefix)) {
$builder->prefix($this->rememberCachePrefix);
}
# 默认缓存驱动
if (isset($this->rememberCacheDriver)) {
$builder->cacheDriver($this->rememberCacheDriver);
}
return $builder;
}
}
参考文章
站内地址:https://learnku.com/laravel/projects/watso...
GitHub地址:https://github.com/dwightwatson/rememberab...
本作品采用《CC 协议》,转载必须注明作者和本文链接