Bu sonucu elde etmek için gerekli sorgu sayısını azaltmak için nasıl

0 Cevap php

Ben daha iyi benim kitap toplama organize etmek CodeIgniter üstüne bir uygulama yazıyorum. Neredeyse bitti, ama benim 'göz' sayfasında çok sayıda sorgu çalıştıran fark - kendi bilgi almak için - kitap başına iki. Açıkçası de ideal, ben özellikle bu yana yaklaşık 1000 kitap, bu sistemin içine koymak için değil.

Şu anda (sonunda parametreleri almak için değiştirilmiş olacak - ki sonraki adım) tüm kitapları alır bir model işlevi var ve döndürülen her kitap için meta bilgi alır başka. İkinci işlevi, her kitap için iki sorgu yapan bir - bir kitap ile ilişkili etiketleri almak için kitap tablodaki bilgi almak ve başka. İşte iki modeli işlevleri şunlardır:

Kitapların listesini alın:

function get_books() {
    $this->db->select('isbn')->order_by('title');
    $query = $this->db->get('books');
    $result = $query->result();
    return $result;
}

Kitap meta bilgileri alın:

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;
}

Ben sonra yerine her biri için iki sorguları yazmak yerine, süzülmeye nesnelerin içine tüm kayıtları toplayacak bir veya iki sorguları yazmak için bir yol var eminim, ama ben bile yazmaya çalışırken başlamak için hiçbir fikrim yok söyledi. Herhangi bir öneri bekliyoruz.

Thanks much, Marcus

0 Cevap