【问题标题】:How to "reset" CodeIgniter active record for consecutive queries?如何为连续查询“重置” CodeIgniter 活动记录?
【发布时间】:2011-06-05 21:35:29
【问题描述】:

我正在使用 CodeIgniter 并且有一个情况,其中两个表(项目和任务)需要一个接一个地更新一个值(活动列需要设置为“n”)。我使用的代码是:

function update($url, $id)
{
    $this->db->where('url', $url);
    $this->db->update('projects', array('active' => 'n'));
    $this->db->where('eventid', $id);
    $this->db->update('tasks', array('active' => 'n'));
}

使用此代码,项目表会更新,但任务表不会。如果我注释掉$this->db->update('projects', array('active' => 'n'));,那么任务表就会更新。

我认为这与缓存有关,但我在任务 db->update 调用之前尝试了 flush_cache,但没有任何效果。

有人可以解释如何使用 CodeIgniter 执行连续更新查询吗?

【问题讨论】:

  • 这个应该默认工作正常,因为你没有缓存WHEREs,奇怪的是你有问题。每次更新后尝试echoing $this->db->last_query()exiting 以确保查询实际上是正确的。

标签: php codeigniter


【解决方案1】:

使用

$this->db->start_cache();

在开始查询构建之前

$this->db->stop_cache();

结束查询构建后。另外,使用

$this->db->flush_cache();

停止缓存后。

【讨论】:

    【解决方案2】:

    这行得通:

    $this->db->flush_cache();
    

    如果你不执行 get() 或类似的 CI 并不总是清除缓存。最终代码如下所示:

    $this->db->from('table');
    $this->db->where('field', $field);
    $count = $this->db->count_all_results();
    $this->db->flush_cache();
    

    【讨论】:

      【解决方案3】:

      在第一次调用update 之后尝试调用$this->db->reset();

      编辑:嗯,尝试$this->db->_reset_write(); 刷新查询的所有痕迹。

      【讨论】:

      • 我真的建议不要在 CI 上使用任何以 _* 开头的函数。它们是私有函数。并且它们可能在未来的版本中不可用。 Sources 除了我做的唯一两个例外these
      • 你是对的,这是要避免的:根据他的具体问题,这可能是解决它的唯一方法,所以它适合他。访问 private by convention 方法有时会非常方便,严格来说,如果您不应该这样做,它们可能会被标记为私有(至少在 5.x 和更高版本中)触摸它们。就像所有强大的东西一样,小心处理。
      • 同意,如果有人使用它并且不知道这个事实,也许可以在您的回答中添加一个小警告? (这就是我首先发表评论的原因^^)
      • 没用。我在第一次更新后尝试了两种变体,但只有第一次更新会被提交,第二次更新调用被忽略。同样,如果我注释掉第一个更新调用,第二个更新运行得很好。困惑:O
      • 很奇怪:如果你在第一次和第二次调用update 之后执行echo $this->db->last_query();,会打印出什么?
      【解决方案4】:

      对于 Codeigniter 的第 3 版,正确的方法是:

      $this->db->reset_query()

      在这里找到:http://www.codeigniter.com/userguide3/database/query_builder.html#resetting-query-builder

      第 4 版的 2022 年更新:

      $this->db->resetQuery();

      在这里找到: https://codeigniter.com/user_guide/database/query_builder.html#resetting-query-builder

      【讨论】:

      • 这应该是正确的答案。工作完美。谢谢!
      • 正确答案!谢谢
      【解决方案5】:

      在第二次更新调用中,您是否需要有条件的 url?如果是这样,在您调用第一个更新后,第二个数据不再可用。您需要重新设置:

      function update($url, $id)
      {
          $this->db->where('url', $url);
          $this->db->update('projects', array('active' => 'n'));
          $this->db->where('url', $url);
          $this->db->where('eventid', $id);
          $this->db->update('tasks', array('active' => 'n'));
      }
      
      // Alternatively
      function update($url, $id)
      {
          $where_bit = array(
              'url' => $url,
          );
          $this->db->update('projects', array('active' => 'n'), $where_bit);
          $where_bit['event_id'] = $id;
          $this->db->update('tasks', array('active' => 'n'), $where_bit);
      }
      

      CI 活动记录更新支持将 where 条件作为 key => value 的数组作为第三个参数传入(也可以作为字符串但 id 建议使用数组代替)

      【讨论】:

        【解决方案6】:

        试试

        $this->db->reconnect();
        

        在您的查询之后。

        美好的一天!

        【讨论】:

        • 这将重新连接数据库,这将有效地重置查询,但这对于 OP 试图做的事情来说太过分了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多