让 Laravel 5 数据模型支持 remember () 方法

在使用前后端分离的时候,通常都会遇到这么一个问题,比方说首页进入的时候会调用 N 个接口,这 N 个接口都会去查询数据库中的用户表数据,会导致查询了 N 次。

查阅资料后发现大致有以下方法实现:

  1. MySQL 的 Query Cache
  2. 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 协议》,转载必须注明作者和本文链接
宇宙最厉害
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!