2014-10-06 101 views
1

我有一些原始查询的资料库,例如:Laravel缓存原始查询

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调用或缓存这种原始查询的常见方法吗?

回答

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哈希缓存查询。

+2

如果使用查询参数,这将不起作用,不幸的是,除非模拟预准备语句,否则没有好的方法可以从PDO中取代带有替代参数的sql。 – 2015-07-28 04:39:15

5

,您可以尝试这样

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

希望这有助于你。

+0

如果您要为每个表执行多个查询,缓存键当然不应该是表的名称。 – 2015-07-27 23:14:50