我有一个包含许多原始查询的存储库,例如:
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 调用的方法或一种缓存此类原始查询的通用方法?
最佳答案
基于@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 散列作为缓存键来缓存您的查询。
关于php - Laravel 缓存原始查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26214719/