Codeigniter 循环到块查询只获取行的第一块?

Codeigniter loop to chunk query only ever gets the first chunk of rows?

我试图通过从数据库中分块抓取大量数据并将其写入 CSV 来获取大量数据。出于某种原因,下面的代码只将第一个块(2000 行)写入 CSV。我将我的 $chunk 和 $limit 变量写入一个文本文件,它们通过循环并写出正确的值。那么为什么不是 $result=$this->db->get('tblProgram', $chunk, $offset)->result_array();抓住下一块?

你能不能运行 $this->db->get('tblProgram', $chunk, $offset)->result_array();多次使用不同的偏移量?我还能如何遍历结果?

我可以确认我从查询中返回了超过 20 万行,并且如果我将块设置为不同的值,我仍然只会返回第一个块。

//Get rows from tblTrees based on criteria set in options array in downloadable format
    public function get_download_tree_data($options=array(), $rand=""){

        $this->db->reset_query();
        $this->db->join('tblPlots','tblPlots.programID=tblProgram.pkProgramID');
        $this->db->join('tblTrees','tblTrees.treePlotID=tblPlots.id');
        $this->db->order_by('tblTrees.id', 'ASC');

       // $allResults=$this->db->count_all_results('tblProgram', false);
        $allResults=200000;
        $offset=0;
        $chunk=2000;
        $treePath=$this->config->item('temp_path')."$rand/trees.csv";
        $tree_handle=fopen($treePath,'a');
        $tempPath=$this->config->item('temp_path')."$rand/trees.txt";
        $temp_handle=fopen($tempPath,'a');
        
        while (($offset<$allResults)) {
            $temptxt=$chunk." ".$offset."\n";
            fwrite($temp_handle,$temptxt);

            $result=$this->db->get('tblProgram', $chunk, $offset)->result_array();
            foreach ($result as $row) {
                fputcsv($tree_handle, $row);
            }    
            $offset=$offset+$chunk;
        }
                    
            fclose($tree_handle);
            fclose($temp_handle);
            return array('resultCount'=>$allResults);
 
    }

https://github.com/bcit-ci/CodeIgniter/blob/develop/system/database/DB_query_builder.php

调用 get 方法似乎重置了您的模型:

    public function get($table = '', $limit = NULL, $offset = NULL)
    {
        if ($table !== '')
        {
            $this->_track_aliases($table);
            $this->from($table);
        }

        if ( ! empty($limit))
        {
            $this->limit($limit, $offset);
        }

        $result = $this->query($this->_compile_select());
        $this->_reset_select();
        return $result;
    }

我想 ci 的任何版本都是这种情况。