Codeigniter:当$ query-> num_rows()`对我不起作用时,如何选择计数?

时间:2012-10-29 20:39:55

标签: php codeigniter activerecord count

我有一个返回总和的查询,所以自然会返回 一个 行。
我需要计算数据库中记录数量的总和。

以下是我所讨论的查询类型(MySQL)的示例:

SELECT 
    i.id, 
    i.vendor_quote_id, 
    i.product_id_requested, 
    SUM(i.quantity_on_hand) AS qty, 
    COUNT(i.quantity_on_hand) AS count
FROM vendor_quote_item AS i
JOIN vendor_quote_container AS c 
    ON i.vendor_quote_id = c.id
LEFT JOIN company_types ON company_types.company_id = c.company_id
WHERE company_types.company_type =  'f'
AND i.product_id_requested =  12345678

我找到了,现在正在使用select_min(),select_max()和select_sum()函数,但我的 COUNT()仍然是硬编码的。

主要 问题是我必须以紧密耦合的方式指定表名称,例如$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' )这会破坏便携性并使交换环境成为PIA。

我怎样才能/我应该以一种非耦合的方式获得我在CI之后的计数值?

4 个答案:

答案 0 :(得分:1)

如果你想要一个完全解耦的处理方法,只需运行查询来获取你用SUM()添加的所有行,然后用PHP将它们一起添加。

$sum = 0;
foreach($query->result() as $row)
{
    $sum += $row->quantity_on_hand;
}

或类似的东西。

答案 1 :(得分:0)

如何在var或const中定义表,然后像这样执行查询:

define('VENDOR_QUOTE_ITEM', 'vendor_quote_item');
$this->$db->select( 'COUNT(' . VENDOR_QUOTE_ITEM . '.quantity_on_hand) AS count' );

这应该比$ query-> num_rows()快,因为它会检索结果并让PHP计算它们。上面的代码切换到追逐,只是要求DB进行计数而不返回任何其他内容(因为它使用了mysql的COUNT())

至于为什么$ query-> num_rows();无效。确保您在CI查询结果对象上调用num_rows。你应该有这样的东西:

$your_query = $this->db->query("YOUR QUERY");
$your_query->num_rows() 

答案 2 :(得分:0)

如果你想在$ this-> db-> select()函数中使用任何MySQL函数,则将第二个参数传递为FALSE。

所以它应该是$this->$db->select( 'COUNT(myDbPrefix_vendor_quote_item.quantity_on_hand) AS count' , FALSE)

答案 3 :(得分:0)

嗯......虽然它与我最初设想的方向不同,但最终我simply extending CI via the directions found HERE

我添加了select_count()方法,以匹配现有的select_min()select_max()select_sum()方法。
此添加仅适用于MySQL,但它是一个可靠的解决方案。

如果将来有人遇到类似的问题,这就是我的所作所为:

  1. 我将Simons“MY_Loader”直接放入我的“应用程序/核心” 目录(不需要改变一件事)。
  2. 然后我在“application / core”目录中创建了一个“MY_DB_mysql_driver”, 根据他的指示...并使它像这样说出来:(为了简洁而没有评论)
  3. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    class My_DB_mysql_driver extends CI_DB_mysql_driver {
    
        final public function __construct($params) {
            parent::__construct($params);
            log_message('debug', 'Extended DB driver class instantiated!');
    
        }  /* method: __CONSTRUCT */
    
        final public function select_count($select = '', $alias = ''){
    
            if ( !is_string($select) OR $select == ''){
                $this->display_error('db_invalid_query');
            }
            if ($alias == ''){
                $alias = $this->_create_alias_from_table(trim($select));
            }
            $sql = 'COUNT('.$this->_protect_identifiers(trim($select)).') AS '.$alias;
            $this->ar_select[] = $sql;
            if ($this->ar_caching === TRUE){
                $this->ar_cache_select[] = $sql;
                $this->ar_cache_exists[] = 'select';
            }
    
            return $this;
    
        }  /* method: SELECT_COUNT */
    
    }
    

    希望它有所帮助。