Laravel缓存原始查询

时间:2014-10-06 10:54:29

标签: php mysql caching laravel laravel-4

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

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

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

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

2)我无法做到

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

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

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

有人可以建议一种方法来重组Fluent调用或缓存此类原始查询的常用方法吗?

2 个答案:

答案 0 :(得分:6)

你可以这样试试

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

希望这会对你有所帮助。

答案 1 :(得分:6)

在@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哈希作为缓存键来缓存您的查询。