11

我正在使用最新codeIgniter发布的版本,我也在使用jquery datatablesfromdatatables.net

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

我试图$res = $this->db->count_all_results()在 my 之前添加get,它完全停止了 get 的工作。我需要完成什么,if ($data['sSearch'] != '')然后利用整个查询而不limit查看存在多少带有搜索过滤器的总行。

如果您需要查看除我的要点之外的任何其他代码,请询问,我会继续发布。

4

7 回答 7

28

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

IE 您可以调用其中一个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();
于 2013-01-07T22:34:21.650 回答
9

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

我看到您正在尝试在需要“真实”总结果并同时进行限制的地方进行一些分页。

这是我在 CI 中编写的大多数代码中的实践。

    $this->db->start_cache();

    // 你的所有条件都没有限制
    $this->db->from();
    $this->db->where(); // 等等...
    $this->db->stop_cache();

    $total_rows = $this->db->count_all_results(); // 这将获得真正的总行数

    // 现在限制行数,以便返回每页结果
    $this->db->limit($per_page, $offset);
    $result = $this->db->get();

    返回数组(
        'total_rows' => $total_rows,
        '结果' => $结果,
    ); // 将此返回给控制器。

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

于 2013-01-08T03:46:46.207 回答
4

您实际上也不必拥有 from ,您可以像这样在 count_all_results 中包含表名。

$this->db->count_all_results('table_name');
于 2016-07-11T14:02:59.130 回答
4

先用 no_reset_flag 计数。

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

系统/数据库/DB_query_builder.php

public function count_all_results($table = '', $reset = TRUE) { ... }
于 2018-06-21T06:30:46.517 回答
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();
于 2013-01-08T00:38:00.410 回答
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']);
于 2018-02-14T06:08:26.860 回答
0

如果您的查询包含 group by,则使用 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;
    }
}
于 2018-10-01T16:51:01.170 回答