codeigniter count_all_results

时间:2013-01-07 21:53:06

标签: codeigniter activerecord

我正在使用已发布的最新codeIgniter,我还在jquery

使用datatables datatables.net

我已经写了这个函数:https://gist.github.com/4478424,因为工作正常。除非我使用输入内容的文本框进行过滤。过滤器本身会发生,但我的计数完全关闭。

我尝试在$res = $this->db->count_all_results()之前添加get,它会阻止get工作。我需要完成的工作if ($data['sSearch'] != '')然后在没有limit的情况下利用整个查询来查看搜索过滤器的总行数。

如果您需要在我的要点中看到除了什么之外的任何其他代码,请询问并继续发布。

7 个答案:

答案 0 :(得分:20)

$this->db->count_all_results()替换数据库调用中的$this->db->get()

即。您可以拨打count_all_results()get(),但不能同时拨打两个。

您需要进行两次单独的有效记录通话。一个用于分配结果#,另一个用于获得实际结果。

这样的计数:

$this->db->select('id');
$this->db->from('table');
$this->db->where($your_conditions);
$num_results = $this->db->count_all_results();

对于实际查询(您应该已经拥有):

$this->db->select($your_columns);
$this->db->from('table');
$this->db->where($your_conditions);
$this->db->limit($limit);
$query = $this->db->get();

答案 1 :(得分:6)

您是否已阅读https://www.codeigniter.com/userguide2/database/active_record.html#caching

我看到你正试图在你需要"真实"的地方做一些分页。总结果并同时限制。

这是我在CI中执行的大多数代码中的练习。


    $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,
    ); // Return this back to the controller.

我在没有测试的情况下键入了上面的代码,但它应该像这样工作。我在所有项目中都这样做。

答案 2 :(得分:1)

$this->db->count_all_results();

实际上取代了:

$this->db->get();

所以你实际上不能同时拥有两者。

如果你想在同一个查询中同时获取和计算num行,你可以轻松地做到这一点:

$this->db->from(....);
$this->db->where(....);
$db_results = $this->get();

$results = $db_results->result();
$num_rows = $db_results->num_rows();

答案 3 :(得分:1)

你实际上不必拥有任何一个,你可以在count_all_results中包含表名,就像这样。

$this->db->count_all_results('table_name');

答案 4 :(得分:0)

试试这个

 /**
        * @param $column_name   :   Use In Choosing Column name
        * @param $where         :   Use In Condition Statement
        * @param $table_name    :   Name of Database Table
        * Description           :   Count all results   
        */ 
    function count_all_results($column_name = array(),$where=array(), $table_name = array())
    {
        $this->db->select($column_name);
        // If Where is not NULL
        if(!empty($where) && count($where) > 0 )
        {
            $this->db->where($where);
        }
        // Return Count Column
        return $this->db->count_all_results($table_name[0]);//table_name array sub 0
    }

然后简单调用方法

喜欢这个

$this->my_model->count_all_results(['column_name'],['where'],['table name']);

答案 5 :(得分:0)

首先使用no_reset_flag进行计数。

... $this->db->count_all_results('', FALSE); $rows = $this->db->get()->result_array();

答案 6 :(得分:0)

如果查询包含分组依据,则使用count_all_results失败。我写了一个简单的方法来解决此问题。防止两次编写查询的关键是将它们全部放入一个可以调用两次的私有方法中。这是一些示例代码:

class Report extends CI_Model {
    ...
    public function get($page=0){
        $this->_complex_query();
        $this->db->limit($this->results_per_page, $page*$this->results_per_page);
        $sales = $this->db->get()->result(); //no table needed in get()

        $this->_complex_query();
        $num_results = $this->_count_results();

        $num_pages = ceil($num_results/$this->results_per_page);

        //return data to your controller
    }

    private function _complex_query(){
        $this->db->where('a', $value);
        $this->db->join('(subquery) as s', 's.id = table.s_id');
        $this->db->group_by('table.column_a');

        $this->db->from('table'); //crucial - we specify all tables here
    }

    private function _count_results(){
        $query = $this->db->get_compiled_select();
        $count_query = "SELECT count(*) as num_rows FROM (".$query.") count_wrap";
        $r = $this->db->query($count_query)->row();
        return $r->num_rows;
    }
}