1

我有这个功能:

   function gi_get_by($col,$id, $itd, $tbl, $limit = 10)
        {    
        $this->db->select('*');
        $this->db->from('global_info');
        $this->db->join($tbl, 'id_' . $tbl . ' = id_global_info');
        $this->db->where('info_type_id', $itd);
        if($col == 'date_created' || $col == 'tag') {$this->db->like($col, $id);}        
        else {$this->db->where($col, $id);}
        if($tbl == 'ad') :
        $this->db->order_by('paid', 'desc');
        endif;
        $this->db->order_by('date_created', 'desc');  
        $this->db->limit($limit, $this->uri->segment(2));
        $q = $this->db->get();        
        return $q = $q->result_array();   
        }

我需要的是在限制之前计算结果数量并稍后在控制器中使用它们。我有一个想法在没有$limit的情况下复制这个函数,但它会复制相同的函数。有没有其他方法可以做到这一点,或者我必须重复?

4

4 回答 4

2

我不太明白你想要做什么,但如果你想要一个可选的限制,你可以将其默认为 false:

 function gi_get_by($col,$id, $itd, $tbl, $limit=false)
        {    
        $this->db->select('*');
        $this->db->from('global_info');
        $this->db->join($tbl, 'id_' . $tbl . ' = id_global_info');
        $this->db->where('info_type_id', $itd);
        if($col == 'date_created' || $col == 'tag') {$this->db->like($col, $id);}        
        else {$this->db->where($col, $id);}
        if($tbl == 'ad') :
        $this->db->order_by('paid', 'desc');
        endif;
        $this->db->order_by('date_created', 'desc');
        if ($limit) {  
          $this->db->limit($limit, $this->uri->segment(2));
        }
        $q = $this->db->get();        
        return $q = $q->result_array();   
        }

如果将它传递给函数,这将有条件地添加限制子句。

此外,最好将 wwhatever$this->uri->segment(2)作为参数传递给函数,而不是从函数内部访问它。

于 2012-09-27T19:43:00.457 回答
1

为什么不选择

sql_calc_found_rows

在您的查询中?

http://www.justincarmony.com/blog/2008/07/01/mysql-php-sql_calc_found_rows-an-easy-way-to-get-the-total-number-of-rows-regardless-of-limit/

于 2012-09-27T19:39:21.190 回答
0

好吧,这样的事情怎么样:

function gi_get_by($col,$id, $itd, $tbl, $limit = 10)
{
    $count = $this->db->query('SELECT * FROM my_table')->num_rows();

    //the rest stuff
}
于 2012-09-27T19:39:08.727 回答
0

您应该使用活动记录缓存:

http://codeigniter.com/user_guide/database/active_record.html#caching

function gi_get_by($col,$id, $itd, $tbl, $limit = 10)
{    
    // Start the cache
    $this->db->start_cache();

    $this->db->select('*');
    $this->db->from('global_info');
    $this->db->join($tbl, 'id_' . $tbl . ' = id_global_info');
    $this->db->where('info_type_id', $itd);
    if($col == 'date_created' || $col == 'tag') {$this->db->like($col, $id);}        
    else {$this->db->where($col, $id);}
    if($tbl == 'ad') :
    $this->db->order_by('paid', 'desc');
    endif;
    $this->db->order_by('date_created', 'desc');

    // Stop the cache
    $this->db->stop_cache();

    // Get the total
    $total = $this->db->count_all_results();

    // Now set the limit
    $this->db->limit($limit, $this->uri->segment(2));

    $q = $this->db->get();

    // Important! Clear the cache
    $this->db->flush_cache();

    return $q = $q->result_array();   
}
于 2012-09-27T19:46:49.737 回答