【问题标题】:Restrict CodeIgniter Active Record Cache to only one object将 CodeIgniter 活动记录缓存限制为仅一个对象
【发布时间】:2011-12-07 14:20:41
【问题描述】:

我正在使用 CodeIgniter。

假设我有一个用于当前用户的模型和一个用于用户列表的模型。在用户列表的模型中,我缓存了 WHERE 语句,因为如果我不这样做,我必须在使用 $this->db->count_all_results 之后再次应用它们(该函数重置活动记录函数)。我当然也需要那些用于 $this->db->get('users')。

userlist 模型中过滤用户的函数如下所示:

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

问题是我也在为当前用户使用模型。我怀疑我在 userlist 模型中设置的缓存也复制到当前用户模型(我同时使用两者,所以从当前用户模型开始时我无法刷新缓存)。我认为活动记录缓存应该保留在它被调用的对象中。

我该如何规避或解决这个问题?

(我的英语还不错,但是结合这些复杂的东西,我可能还没有完全理解对象/类,希望你能理解我的问题^^)

【问题讨论】:

    标签: php oop codeigniter caching model


    【解决方案1】:

    当您使用内置的 Loader 类(例如,使用 $this->load->database()$this->load->model('user'))加载类时,CodeIgniter 会有效地创建单例。这就是为什么活动记录缓存在您的 Userlist 和 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();
        }
    
    }
    

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

    【讨论】:

    • 我不这样做,因为我有 3 个可选的 WHERE 语句。要进行所有可能的组合,您必须制作 8 种单独的方法(而当您按照我的方式进行时则为 4 种)。但是感谢您的回答.. 我认为目前我能做的最好的事情就是不要同时使用模型。
    • 您可以使用可选参数来确定要添加的 where 子句。让我写一个例子。
    • 省事。我明白你的意思;)但问题是无论如何我都需要缓存函数,因为在应用 WHERE 语句后,我会执行 count_all_results。这将重置活动记录子句。但是我仍然需要 WHERE 语句和限制来执行 get()(并且因为 get() 需要限制而不是 count_all_results,所以我确实需要在之前执行 count_all_results)
    猜你喜欢
    • 2014-06-25
    • 2012-11-23
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多