我正在编写CodeIgniter之上的应用程序,以更好地组织我的电子书收藏。我差不多完成了,但是我意识到我的'浏览'页面正在运行太多的查询 - 每本书两个 - 来获取他们的信息。显然不是理想的,特别是因为我有大约1000本书投入这个系统。如何减少获得此结果所需的查询数
我目前有一个模型函数可以获取所有书籍(最终将被修改为接受参数 - 这是下一步),另一个获取每个返回书籍的元信息。第二个功能是对每本书进行两次查询 - 一个用于获取书本表中的信息,另一个用于获取与该书籍相关的标签。下面是这两个型号的功能:
获取图书列表:
function get_books() {
$this->db->select('isbn')->order_by('title');
$query = $this->db->get('books');
$result = $query->result();
return $result;
}
拿到书元信息:
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;
}
我敢肯定有写一个或两个查询方式它会将所有记录收集到可以过滤的对象中,而不必为每个对象编写两个查询,但我不知道应该在哪里开始尝试写入。欢迎任何建议。
谢谢了, 马库斯
看起来不错,从我可以告诉。做得好! – 2010-09-30 10:33:56