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 的任何版本都是这种情况。
我试图通过从数据库中分块抓取大量数据并将其写入 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 的任何版本都是这种情况。