2013-01-07 13 views
7

sto lavorando con l'ultima codeIgniter rilasciato, e sto anche lavorando con jquerydatatables da datatables.netcount_all_results CodeIgniter

ho scritto questa funzione: https://gist.github.com/4478424 che, come è funziona bene. Tranne quando filtro usando la casella di testo digitando qualcosa. Il filtro stesso accade, ma il mio conteggio è completamente disattivato.

Ho provato ad aggiungere $res = $this->db->count_all_results() prima del mio get e interrompe il funzionamento. Quello che ho bisogno di realizzare, if ($data['sSearch'] != '') quindi di utilizzare l'intera query senza il limit per vedere quante righe totali con il filtro di ricerca esiste.

Se è necessario vedere qualsiasi altro codice diverso da quello che è nel mio senso, basta chiedere e io andrò avanti e pubblicarlo.

risposta

18

$this->db->count_all_results() sostituisce $this->db->get() in una chiamata al database.

I.E. puoi chiamare sia count_all_results() o get(), ma non entrambi.

È necessario effettuare due chiamate di registrazione attive separate. Uno per assegnare i risultati # e uno per ottenere i risultati effettivi.

qualcosa di simile per il conteggio:

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

E per la query effettiva (che si dovrebbe già avere):

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

Il

$this->db->count_all_results(); 

sostituisce in realtà il:

$this->db->get(); 

Quindi non è possibile avere entrambi.

Se si vuole fare avere sia ottenere e per calcolare le righe num alla stessa query si può facilmente fare questo:

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

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

Ha bisogno di limitare l'altra query in modo che non sta tirando in tutto in una volta, che è il motivo per cui il mio esempio include due query distinte. Selezionando solo id (molto veloce) allo scopo di ottenere il # di righe e quindi facendo la query "lenta" per ottenere le righe della pagina corrente. – Brendan

5

Hai letto su http://ellislab.com/codeigniter/user-guide/database/active_record.html#caching?

Vedo che si sta tentando di eseguire un'impaginazione in cui è necessario ottenere risultati "reali" e al tempo stesso limitativi.

Questa è la mia pratica nella maggior parte dei miei codici che faccio in 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. 

Ho digitato i codici sopra senza test ma dovrebbe funzionare in questo modo. Lo faccio in tutti i miei progetti.

+0

Grazie @kong jin jie. Questo risolve il mio problema –

1

In realtà non è necessario averne uno, è possibile includere il nome della tabella in count_all_results in questo modo.

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

Prova questo

/** 
     * @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 
    } 

chiamata Poi Semplice Metodo

Ti piace questa

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