J'écris une application sur CodeIgniter pour mieux organiser ma collection de livres électroniques. J'ai presque terminé, mais je me rends compte que ma page "parcourir" contient beaucoup trop de requêtes - deux par livre - pour obtenir leurs informations. Évidemment pas du tout idéal, d'autant plus que j'ai environ 1000 livres à mettre dans ce système.Comment réduire le nombre de requêtes nécessaires pour obtenir ce résultat
J'ai actuellement une fonction de modèle qui obtient tous les livres (sera finalement modifié pour prendre des paramètres - c'est l'étape suivante) et un autre qui obtient les méta-informations pour chaque livre retourné. La deuxième fonction est celle qui fait deux requêtes pour chaque livre - une pour obtenir l'information dans la table du livre et une autre pour obtenir les étiquettes associées au livre. Voici les deux fonctions du modèle:
obtenir la liste des livres:
function get_books() {
$this->db->select('isbn')->order_by('title');
$query = $this->db->get('books');
$result = $query->result();
return $result;
}
Obtenir le livre méta-informations:
function get_book_info($isbn) {
// Grab the book from Amazon
$amazon = $this->amazon->get_amazon_item($isbn);
// Get the book info
$this->db->select('title, publisher, date, thumb, filename, pages');
$query = $this->db->get_where('books', array('isbn' => $isbn));
$bookResult = $query->row();
// Get the book's tags
$this->db->select('tag');
$this->db->from('tags AS t');
$this->db->join('books_tags AS bt', 'bt.tag_id = t.id', 'left');
$this->db->where('bt.book_id', $isbn);
$this->db->order_by('t.tag');
$tagQuery = $this->db->get();
foreach ($tagQuery->result() as $row) {
$tagResult[] = $row->tag;
}
$tagResult = implode(', ', $tagResult);
// Send data
$data = array(
'isbn' => $isbn,
'thumb' => $bookResult->thumb,
'title' => strip_slashes($bookResult->title),
'file' => $bookResult->filename,
'publisher' => strip_slashes($bookResult->publisher),
'date' => date('F j, Y', strtotime($bookResult->date)),
'pages' => $bookResult->pages,
'tags' => $tagResult,
'rating' => $amazon->Items->Item->CustomerReviews->AverageRating,
'raters' => $amazon->Items->Item->CustomerReviews->TotalReviews
);
return $data;
}
Je suis certain qu'il ya un moyen d'écrire un ou deux requêtes Cela va rassembler tous les enregistrements dans des objets que je peux ensuite filtrer, plutôt que d'avoir à écrire deux requêtes pour chacun d'eux, mais je n'ai aucune idée de l'endroit où même commencer à essayer d'écrire cela. Toutes les suggestions sont les bienvenues.
Merci beaucoup, Marcus
En regardant bien, d'après ce que je peux dire. Bien joué! –