我有一个包含大量原始查询的存储库,例如:
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调用或缓存此类原始查询的常用方法吗?
答案 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哈希作为缓存键来缓存您的查询。