我正在使用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();
}
问题是我还在为当前用户使用模型。我怀疑我在用户列表模型中设置的缓存也会复制到当前用户模型(我同时使用这两种模式,所以在使用当前用户模型时我无法刷新缓存)。我认为活动记录缓存应该保留在它被调用的对象中。
我如何规避或解决这个问题?
(我的英语不是那么糟糕,但结合这些复杂的东西,我可能没有完全理解对象/类,我希望你理解我的问题^^)
答案 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();
}
}
显然它可能会变得更复杂,但这是一般的想法。