2014-10-06 137 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