2011-12-07 40 views
0

我正在使用CodeIgniter。將CodeIgniter活動記錄緩存限制爲僅限一個對象

比方說,我有一個當前用戶的模型和用戶列表的模型。在用戶列表模型中,我緩存WHERE語句,因爲如果我不這樣做,我必須在使用$ this-> db-> count_all_results(該函數重置活動記錄函數)之後再次應用它們。我當然也需要那些$ this-> db-> get('users')。

在用戶列表模式來過濾用戶的功能是這樣的:

public function onlyWomen() 
{ 
$this->db->start_cache(); 
$this->db->where('gender', '1'); 
$this->db->stop_cache(); 
} 

問題是,我也與當前用戶的模型工作。我懷疑我在用戶列表模型中設置的緩存還複製到當前用戶模型(我正在同時使用這兩個模型,因此無法在用當前用戶模型啓動時刷新緩存)。我認爲活動記錄緩存應該保留在被調用的對象中。

我該如何規避或解決這個問題?

(我的英文不是那麼糟糕,但在這個複雜的東西和我的組合也許不能完全理解的對象/班,我希望你明白我的問題^^)

回答

1

當您加載笨有效地創建單身類使用內置的Loader類(例如,使用$this->load->database()$this->load->model('user'))。這就是爲什麼活動記錄緩存在用戶列表和用戶模型之間保持不變。沒有任何方法可以規避這種情況。你將不得不編輯核心文件來實現解決方案。

與其創建通過緩存構建查詢的方法,爲什麼不創建用於構建和執行查詢的方法?這裏是我的意思的例子:

class Userlist extends CI_Model { 

    public function get_women() 
    { 
     // Build and execute active record query 
     $this->db->where('gender', '1'); 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->results(); 
    } 

} 

編輯:添加使用可選參數用於指定where子句的例子。

class Userlist extends CI_Model { 

    public function get_users($gender = false, $limit = false) 
    { 
     // Build active record query 
     if ($gender !== false) { 
      $this->db->where('gender', $gender); 
     } 
     if ($limit !== false) { 
      $this->db->limit($limit); 
     } 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->results(); 
    } 

} 

很明顯,它可以稍微複雜一些,但這是一般的想法。

+0

我不這樣做,因爲我有3個可選的WHERE語句。要做出所有可能的組合,你必須製作8種獨立的方法(而按照我的方式做4種方法)。但是,謝謝你的答案..我認爲我現在可以做的最好的事情就是不要同時使用模型。 – Gersom

+0

您可以使用可選參數確定要添加哪些子句。讓我寫一個例子。 – birderic

+0

備用工作。我明白你的意思;) 但問題是,我將需要緩存功能無論如何,因爲在應用WHERE語句後,我做了一個count_all_results。這會重置活動記錄子句。但我仍然需要WHERE語句以及get() (並且因爲get()而不是count_all_results需要該限制,所以我確實需要在之前執行count_all_results) – Gersom