【问题标题】:Codeigniter Paginantion get real result total in controllerCodeigniter Pagination 在控制器中获得实际结果总数
【发布时间】:2015-11-26 08:40:15
【问题描述】:

我正在对我的模型中的大型数据库进行复杂查询,并且需要在限制分页结果之前计算总行数。

我的模型如下:

public function get_categoryads($limit, $start, $cid, $type)
{
$this->db->start_cache();

// All your conditions without limit
$this->db->from();
$this->db->where(); // and etc...
$this->db->stop_cache();

$total_rows = $this->db->count_all_results(); // This will get the real total rows

// Limit the rows now so to return per page result
$this->db->limit($per_page, $offset);
$result = $this->db->get();

return array(
    'total_rows' => $total_rows,
    'result'     => $result,
);
}

我不明白现在如何在我的控制器中调用它。 1.获取要交给视图的结果 2. 获取total_rows 交给控制器中的分页配置。 如何在控制器中调用结果数组和总行数?

在我的控制器中:

// call the model function to get the result List data if not in an array
$data['results'] = $this->my_model->get_categoryads(10, 0, $cid, $type);

当模型推出一个数组时,这肯定行不通... 然后我应该在我的控制器中做些什么来获得以下信息:

// call the model function to get the result List data if not in an array
$data['results'] = $this->my_model->get_categoryads(10, 0, $cid, $type);
// Get total results for Pagination Config:
$config['total_rows'] = $this->db->count_all_results();

我做吗

$config['total_rows'] = $this->db->count_all_results($data['results']);

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    您可以在控制器中这样做:

    $results = $this->my_model->get_categoryads(10, 0, $cid, $type);
    
    // Array of result rows to be sent to view
    $data['results'] = $results['result'];
    
    // For pagination config:
    $config['total_rows'] = $results['total_rows'];
    

    【讨论】:

    • 感谢@Sultan 的回答我现在得到总行数,但在视图中调用 $data['results'] 时出现错误。 foreach($results as row){} 给我一个错误。 (解析错误:语法错误,意外的 '$results' (T_VARIABLE) in....)我现在如何在视图中调用 $data['results']?
    • 如果您有任何未闭合的大括号,则会出现错误“Parse error: syntax error, unexpected '$results' (T_VARIABLE) in....”。您只需在视图文件中调用 $results 即可。这应该有效: foreach($results as $row) { }
    【解决方案2】:

    你可以使用codeigniter分页概念:-

    1. 您已经通过 uri 段获取页面偏移量,例如:-

      $page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0; // 这取决于你的 uri 段

    2. 现在用大约页面偏移量调用你的模型

      $this->my_model->get_results($page,$something);

    3. 现在计算总行数:-

        $cnt=$this->my_model->count_results($something);
      

    如果第 2 步和第 3 步是一次性完成的,那么你必须这样做......

          $temp=array();
          $temp['result']=your query result;
          $temp['count']=your count result;
    
    1. 现在插入这行进行分页:-

      $this->load->library("pagination");
      $config = array();
      
      $config["total_rows"] = $cnt; // or $result['count']
      $config["per_page"] = 10;
      $config['uri_segment'] = 4;
      $config['num_links']=2;
      $config['first_link'] = 'First';
      $config['last_link'] = 'Last';  
      $config["base_url"] = your _controller_url
      $config["display_pages"]=TRUE;
      $this->pagination->initialize($config);
      $data["links"] = $this->pagination->create_links();
      
    2. 现在调用你的视图:-

          $this-> load->view(your_view_name);
      
    3. 在您看来,您必须添加div 标签,例如:

         <div class="pagination">
             <?php echo $links;?>
         </div>       
      

    希望这对您有所帮助。

    【讨论】:

    • 问题不在于如何进行分页。我在模型中的一个数组中调用结果和 total_rows。我想知道然后我如何调用结果以发送到视图以及我应该怎么做才能调用控制器中的 total_rows 以便我可以将它用于 $config['total_rows'] 进行分页......还是我误解了你的答案?
    • 在我的回答中看到我已经分别计算了两件事,如果你想你可以在一个数组中计算它,你可以通过数组传递它。好的,我正在更新我的答案
    • 我编辑了我的问题,因为您的回答似乎与我的问题无关。
    • 也许我误解了您的问题...对此我很抱歉...您能告诉我您到底想要什么吗???
    • @Sultan 的答案更符合我正在寻找的答案,但仍然有错误...我现在得到总行数,但在调用 $data['results' 时出现错误] 在视图中。 foreach($results as row){} 给我一个错误。 (解析错误:语法错误,意外的 '$results' (T_VARIABLE) in....)我现在如何在视图中调用 $data['results']?
    【解决方案3】:

    我认为你可以用更好的代码方式来做到这一点。

    1. 在查询过滤器之前获取总结果。
    2. 获取查询过滤后的总结果。
    3. 获取查询过滤后的结果。

    话虽如此:

    public function get_categoryads($limit, $start, $cid, $type)
    {
       $this->db->select('COUNT(field) AS `total`')
                ->from('table');
    
       $totalRows = $this->db->get()->row()->total;
    
       $this->db->select('...')
                ->from('...')
                ->where('...')
                ->limit('...');
    
       $totalRowsAfterLimit = $this->db->get()->num_rows();
       $results             = $this->db->get()->results();
    
       return array('totalRows'           => $totalRows,
                    'totalRowsAfterLimit' => $totalRowsAfterLimit,
                    'results'             => $results);
    
    }
    

    最后,在您的控制器中,您可以执行以下操作:

    list($totalRows, $totalRowsAfterLimit, $results) = $this->my_model->get_categoryads('...');
    

    您现在可以遍历结果。

    foreach($results as $result)
    {
       echo $result->some_field_from_database;
    }
    

    【讨论】:

    • 感谢@Linesofcode 示例我一定会测试代码。只是一个问题...这对大型数据库查询是否有效?
    • 应该是,特别是因为我使用了COUNT,这比从 PHP 数组中计算结果要快得多。
    • 可以在 COUNT 代码中使用 group_by() 还是计算唯一字段?我知道它不适用于 count_all_results() 并且会给出不正确的总数。
    • 你可以做你想做的过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多