codeigniter count_all_results

Posted

技术标签:

【中文标题】codeigniter count_all_results【英文标题】: 【发布时间】:2012-12-21 16:45:32 【问题描述】:

我正在使用最新发布的codeIgniter,我也在使用来自datatables.netjquery datatables

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

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

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

【问题讨论】:

【参考方案1】:

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

I.E.您可以拨打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();

【讨论】:

在 CI 4 中相同,countAllResults 的作用类似于 Get()。【参考方案2】:

你读过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, '结果' => $结果, ); // 将此返回给控制器。

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

【讨论】:

我注意到最近的评论,所以我想留下一个警告:如果您的查询有分组依据,count_all_results 将无法正常工作。 (CI 2 也是如此,我没有看过 3)。 count_all_results 方法只是用 count(*) 替换 select。对于需要使用更高级查询进行分页的任何人,我都会留下自己的答案【参考方案3】:

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

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

【讨论】:

【参考方案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)  ... 

【讨论】:

在提出问题时,我猜使用了 CI 2,它没有在其参数中提供重置标志。因此对于 CI 2,我建议使用 Stack Programmer 的解决方案,对于 CI 3,您可以使用 Reset 标志,而无需强制缓存查询。【参考方案5】:

$this->db->count_all_results();

实际上替换了:

$this->db->get();

所以你实际上不能两者兼得。

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

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

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

【讨论】:

他需要限制另一个查询,这样他就不会一次提取所有内容,这就是为什么我的示例包含两个不同的查询。仅选择 id(非常快)以获取行数,然后执行“慢速”查询以获取当前页面的行数。【参考方案6】:

试试这个

 /**
        * @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']);

【讨论】:

假设$where 总是传递给你的count_all_results(),那么if(!empty($where) && count($where) > 0 ) 更简单地写成if ($where) 。这是因为$where 是无条件声明的,并且非空数组是“真实的”。【参考方案7】:

如果您的查询包含 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;
    

【讨论】:

以上是关于codeigniter count_all_results的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义函数 codeigniter\locale_set_default() 时出现 codeigniter 错误

codeigniter 中是不是有子查询库?或者我如何在codeigniter 3中进行子查询?

php优秀框架codeigniter学习系列——CodeIgniter.php概览

Codeigniter- Ajax Codeigniter Ajax - 通过ajax返回不止一行

如何在codeigniter中集成swfupload

CodeIgniter 4 项目中未定义的常量“CodeIgniter\Database\MySQLi\MYSQLI_STORE_RESULT”