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调用或缓存此类原始查询的常用方法吗?
你可以这样试试
$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)
希望这对你有所帮助.
在@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哈希作为缓存键来缓存查询.