Laravel缓存原始查询

Yas*_*vov 2 php mysql caching laravel laravel-4

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

DB::select(DB::raw(
             'SELECT stuffFields
              FROM stuffTable
              A NUMBER OF COMPLEX JOINS, ETC'
          ));
Run Code Online (Sandbox Code Playgroud)

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

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

2)我做不到

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

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

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

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

jus*_*ohu 6

你可以这样试试

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

希望这对你有所帮助.

  • 当然,如果您要对每个表进行多个查询,则缓存键不应该是表的名称。 (2认同)

fir*_*ire 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");
Run Code Online (Sandbox Code Playgroud)

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

  • 如果使用查询参数,这将不起作用,并且遗憾的是,除非模拟预准备语句,否则没有好的方法从PDO获取带有替换参数的sql. (2认同)