CodeIgniter选择数据添加不必要的查询


CodeIgniter selecting data adding unnecessary queries?

我刚刚开始使用CodeIgniter,并且对结果非常满意。

我注意到的一件事是,我似乎用模型的不同部分选择了一行的不同部分。
一个例子是,在一个页面上,我需要获得当前用户的用户名,然后再往下,我需要他们的电子邮件地址。这些是模型中独立的函数(因此是独立的查询)。知道我可以将它们合并到一个查询中(节省开销)让我很恼火,但如果我这样做了,那么我就会失去MVC模型给我的模块化(在许多其他页面上,我只需要用户名或电子邮件,而不是两者都需要)。有什么好建议吗?

是的,但是我有一个特定的函数返回一行的一部分,另一个函数返回一行的另一部分。我需要这样做是因为大多数页面只需要行中的一个部分,但有些页面两者都需要,这导致我的代码运行两个查询。这只是一个例子。有很多。我想知道这是否有一个设计模式。

你实际上是在谈论延迟加载。所以在你的模型中,你使用一些东西来跟踪持久化属性的状态,即它们是否已被加载,修改,或者如果模型是全新的,还没有在数据库中。然后,每个属性的getter首先检查状态,如果有些东西尚未加载并且模型不是"new",那么它们会查询该属性并在返回值之前将其设置在模型上。

所以你的魔法get可能看起来像(伪代码-你必须翻译成CI):

public function __get($property){
   if($this->isPersisted($property) && !$property->isLoaded() && !$this->isNew()){
      $this->$property = $this->db
        ->select($this->getColumn($property))
        ->from($this->tableName)
        ->where('id = ?', $this->id)
        ->fetchColumn(0);
   }
   return $this->property;
}