2010-04-30 7 views
4

J'utilise codeigniter et la classe de pagination. C'est une question tellement fondamentale, mais je dois m'assurer que je ne manque pas quelque chose. Afin d'obtenir les éléments de configuration nécessaires pour paginer les résultats obtenus à partir d'une base de données MySQL, il est fondamentalement nécessaire d'exécuter la requête deux fois, n'est-ce pas? En d'autres termes, vous devez exécuter la requête pour déterminer le nombre total d'enregistrements avant de pouvoir paginer. Donc, je le fais comme:Pagination Codeigniter: Exécuter la requête deux fois?

Faites cette requête pour obtenir le nombre de résultats

$this->db->where('something', $something); 
$query = $this->db->get('the_table_name'); 
$num_rows = $query->num_rows(); 

Alors je vais devoir le faire à nouveau pour obtenir les résultats avec la limite et offset. Quelque chose comme:

$this->db->where('something', $something); 
$this->db->limit($limit, $offset); 
$query = $this->db->get('the_table_name'); 
if($query->num_rows()){ 

    foreach($query->result_array() as $row){ 

     ## get the results here 
    } 
} 

Je me demande simplement si je le fais bien parce que la requête doit toujours être exécutée deux fois? Les requêtes que j'utilise sont beaucoup plus complexes que ce qui est montré ci-dessus.

Répondre

1

Malheureusement, pour paginer, vous devez savoir combien d'éléments vous allez découper en pages.

Vous pouvez toujours mettre en cache le résultat pour le nombre total d'éléments si le calcul est trop coûteux.

1

Oui, vous devez exécuter deux requêtes, mais $this->db->count_all('table_name'); est une ligne beaucoup plus propre &.

+0

exige aussi les frais généraux beaucoup moins que de saisir l'ensemble record –

0

Pagination nécessite la lecture d'un record établi deux fois:

  1. Une fois de lire l'ensemble de façon à pouvoir compter le nombre total enregistre
  2. ensuite lire une fenêtre d'enregistrements à afficher

Voici un exemple que j'ai utilisé pour un projet. Le tableau « bannière » a une liste des bannières, que je veux montrer sur un écran paginé:

  • En utilisant une propriété de classe publique pour stocker les enregistrements (total_records public $)
  • en utilisant une fonction privée construire la requête (ce qui est commun pour les deux activités). Le paramètre ($ isCount) que nous transmettons à cette fonction réduit la quantité de données générée par la requête, car pour le nombre de lignes, nous avons seulement besoin d'un champ, mais lorsque nous lisons la fenêtre de données, nous avons besoin de tous les champs obligatoires.
  • La fonction get_list() appelle d'abord la base de données pour trouver le total et le stocke dans $ total_records, puis lit une fenêtre de données pour retourner à l'appelant. Rappelez-vous que nous ne pouvons pas accéder à $ total_records sans d'abord appeler la méthode get_list()!

class Banner_model extends CI_Model { 

public $total_records; //holds total records for get_list() 

public function get_list($count = 10, $start = 0) { 
    $this->build_query(); 
    $query = $this->db->get(); 
    $result = $query->result(); 
    $this->total_records = count($result); //store the count 

    $this->build_query(); 
    $this->db->limit($count, $start); 
    $query = $this->db->get(); 
    $result = $query->result(); 

    return $result; 
} 

private function build_query($isCount = FALSE) { 
    $this->db->select('*, b.id as banner_id, b.status as banner_status'); 
    if ($isCount) { 
     $this->db->select('b.id'); 
    } 
    $this->db->from('banner b'); 
    $this->db->join('company c', 'c.id = b.company_id'); 
    $this->db->order_by("b.id", "desc"); //latest ones first 
} 

Et maintenant du contrôleur que nous appelons:

$data['banner_list'] = $this->banner_model->get_list(); 
$config['total_rows'] = $this->banner_model->total_records; 

Les choses se compliquent lorsque vous commencez à utiliser JOIN, comme dans mon exemple où vous voulez montrer des bannières d'une entreprise particulière !Vous pouvez lire mon blog sur cette question:

http://www.azmeer.info/pagination-hitting-the-database-twise/