web-dev-qa-db-fra.com

codeigniter count_all_results

Je travaille avec la dernière codeIgniter publiée et je travaille également avec jquerydatatables de datatables.net

J'ai écrit cette fonction: https://Gist.github.com/4478424 that, as is as well,. Sauf lorsque je filtre en utilisant la zone de texte en tapant quelque chose. Le filtre lui-même se produit, mais mon nombre est complètement désactivé.

J'ai essayé d'ajouter $res = $this->db->count_all_results() avant ma get, et cela empêche le get de fonctionner. Ce que je dois accomplir, if ($data['sSearch'] != '') puis utiliser la requête entière sans la limit pour voir le nombre total de lignes avec le filtre de recherche existant.

Si vous avez besoin de voir un autre code que ce qui est dans mon Gist, demandez-le-moi et j'irai de l'avant et le posterai.

8
Johnny

$this->db->count_all_results() remplace $this->db->get() dans un appel de base de données.

C'EST À DIRE. vous pouvez appeler soit count_all_results() ou get(), mais pas les deux.

Vous devez faire deux appels distincts d’enregistrements actifs. Un pour assigner les résultats, et un pour obtenir les résultats réels.

Quelque chose comme ça pour le compte:

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

Et pour la requête actuelle (que vous devriez déjà avoir):

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

Avez-vous lu sur http://ellislab.com/codeigniter/user-guide/database/active_record.html#caching ?

Je vois que vous essayez de faire une pagination où vous avez besoin du "total" total des résultats et en même temps de la limitation.

Ceci est ma pratique dans la plupart de mes codes que je fais dans CI.

 
 $ this-> db-> start_cache (); 
 
 // Toutes vos conditions sans limite 
 $ this-> db-> de (); 
 $ this-> db-> where (); // et etc ... 
 $ this-> db-> stop_cache (); 
 
 $ total_rows = $ this-> db-> count_all_results (); // Cela va donner le nombre total réel de lignes 
 
 // Limiter les lignes maintenant pour retourner par résultat de page 
 $ This-> db-> limit ($ per_page, $ offset ); 
 $ resultat = $ this-> db-> get (); 
 
 retourne un tableau (
 'total_rows' => $ total_rows, 
 'result' => $ result, 
); // Retournez ceci au contrôleur. 
 

J'ai tapé les codes ci-dessus sans les tester, mais cela devrait fonctionner comme ceci. Je le fais dans tous mes projets.

6
Kong Jin Jie

Le

$this->db->count_all_results();

remplace en réalité le:

$this->db->get();

Donc, vous ne pouvez pas vraiment avoir les deux.

Si vous voulez que les deux obtiennent et calculent les lignes numériques de la même requête, vous pouvez facilement le faire:

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

$results = $db_results->result();
$num_rows = $db_results->num_rows();
1
John Skoumbourdis

Vous ne devez pas non plus avoir le caractère from, vous pouvez également inclure le nom de la table dans la table count_all_results.

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

Si vos requêtes contiennent un groupe par, l'utilisation de count_all_results échoue. J'ai écrit une méthode simple pour contourner ce problème. Pour éviter d'écrire deux fois vos requêtes, il est essentiel de les placer toutes dans une méthode privée pouvant être appelée deux fois. Voici un exemple de code:

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;
    }
}
0
Tim Mickey

Comptez d'abord avec no_reset_flag.

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

0
Jehong Ahn

Essaye ça

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

Puis appel simple la méthode

Comme ça

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