2010-04-30 4 views
4

저는 codeigniter와 페이지 매김 클래스를 사용하고 있습니다. 이것은 기본적인 질문이지만, 나는 뭔가를 놓치지 않도록해야합니다. MySQL 데이터베이스에서 결과를 페이지 매김하는 데 필요한 구성 항목을 얻으려면 기본적으로 쿼리를 두 번 실행해야합니다.Codeigniter 페이지 매김 : 쿼리를 두 번 실행 하시겠습니까?

즉, 페이지 매김을 수행하기 전에 쿼리를 실행하여 총 레코드 수를 결정해야합니다. 그래서 나는 그것을 좋아하고 있어요 :

결과

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

의 수를 얻기 위해이 쿼리를 수행 그럼 난 한계와 오프셋으로 결과를 얻기 위해 다시해야 할 것이다. 뭔가 같은 :

내가 실제로이 쿼리를 항상 두 번 실행해야합니다 에서이 일을하는지 궁금해? 사용중인 쿼리는 위에 표시된 것보다 훨씬 복잡합니다.

답변

1

페이지 매김을하기 위해 몇 개의 요소로 페이지를 분할해야 하는지를 알아야합니다.

너무 많은 계산 비용이 발생하는 경우 총 요소 수에 대한 결과를 항상 캐시 할 수 있습니다.

1

네, 두 개의 쿼리를 실행해야하지만, $this->db->count_all('table_name');은 & 라인이 훨씬 깨끗합니다.

+0

는 전체 레코드 집합을 잡는 것보다 훨씬 적은 오버 헤드를 필요로 : 당신은 더이 문제에 대한 내 블로그 게시물을 읽을 수 있습니다 –

0

매김은 기록을 두 번 설정 읽어야합니다 : 그것은 총 수는 다음 표시 할 레코드 창을 읽을

  • 를 기록 셀 수 있도록

    1. 는 일단 전체 집합을 읽을 수

    다음은 프로젝트에 사용한 예제입니다. 개인 함수를 사용하여 전체 기록 (공공 $의 total_records)

  • 를 저장하는 공용 클래스 속성을 사용

    • 다음 '배너'테이블 내가 매겨진 화면에 표시 할 배너의 목록을 가지고 쿼리 작성 (두 활동 모두 공통) 우리가이 함수에 전달하는 매개 변수 ($ isCount)는 쿼리가 생성하는 데이터의 양을 줄입니다. 왜냐하면 행 수에 대해 하나의 필드 만 필요하기 때문에 데이터 윈도우를 읽을 때 모든 필수 필드가 필요하기 때문입니다.
    • get_list() 함수는 먼저 데이터베이스를 호출하여 합계를 찾고 $ total_records에 저장 한 다음 데이터 창을 읽어 호출자에게 반환합니다.
    • 먼저 get_list() 메소드를 호출하지 않고 $ total_records에 액세스 할 수 없음을 기억하십시오!
      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 
      } 
      

      그리고


    이제 컨트롤러에서 우리는 전화 : 당신은 당신이 특정 회사의 배너를 표시 할 위치를 내 예처럼, JOIN을 사용하기 시작할 때

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

    상황이 복잡 !

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

  • 관련 문제