【问题标题】:Laravel Cache Raw QueriesLaravel 缓存原始查询
【发布时间】:2014-11-30 14:57:55
【问题描述】:

我有一个包含许多原始查询的存储库,例如:

DB::select(DB::raw(
             'SELECT stuffFields
              FROM stuffTable
              A NUMBER OF COMPLEX JOINS, ETC'
          ));

我想缓存此查询的结果,但遇到了几个问题:

1) 我做不到 ->remember(60),因为 Fluent 查询不是使用 table() 方法启动的。

2) 我做不到

DB::table('stuffTable')
          ->select(DB::raw(
             'stuffFields
              A NUMBER OF COMPLEX JOINS, ETC'
          ))->get();

因为存在这些连接,并且 FROM 子句被附加在查询的末尾(连接之后),这会引发 SQL 语法错误。

我也无法在 join() 方法中显示连接,因为它们包含嵌套查询(有没有办法执行 rawJoin()...我找不到类似的东西?)。

谁能建议一种方法来重组 Fluent 调用或缓存此类原始查询的常用方法?

【问题讨论】:

    标签: php mysql caching laravel laravel-4


    【解决方案1】:

    在@justrohu 回答的基础上,您可以使用一种方法来包装所有原始查询...

    public function cacheQuery($sql, $timeout = 60) {
        return Cache::remember(md5($sql), $timeout, function() use ($sql) {
            return DB::raw($sql);
        });
    }
    
    $results = $this->cacheQuery("SELECT * FROM stuff INNER JOIN more_stuff");
    

    这将通过创建 SQL 的 MD5 哈希作为缓存键来缓存您的查询。

    【讨论】:

    • 如果使用查询参数,这将不起作用,不幸的是,除非模拟准备好的语句,否则没有好的方法可以从 PDO 获取带有替换参数的 sql。
    【解决方案2】:

    你可以这样试试

    $stuffTable = Cache::remember('stuffTable', 60, function()
    {
     return  DB::table('stuffTable')
              ->select(DB::raw(
                 'stuffFields
                  A NUMBER OF COMPLEX JOINS, ETC'
              ))->get();
    });
    

    希望这对您有所帮助。

    【讨论】:

    • 当然,如果您要对每个表执行多个查询,缓存键不应该是表的名称。
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2017-11-17
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多