将CodeIgniter Active Record Cache限制为仅一个对象

时间:2011-12-07 14:20:41

标签: php oop codeigniter caching model

我正在使用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 个答案:

答案 0 :(得分:1)

使用内置的Loader类加载类时,CodeIgniter可以有效地创建单例(例如,使用$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();
    }

}

显然它可能会变得更复杂,但这是一般的想法。