2012-07-19 3 views
0

나는 CakePHP 2.x를 사용하고 매거진에 넣고 싶은 게시물이 많은 스레드가 있습니다. 그러나 SQL 로그를 살펴보면 스레드의 모든 게시물 (25k)에 영향을주는 SELECT 문이 있습니다. 사실 20 개의 게시물 만 표시되므로이 오버 헤드를 피할 수있는 방법이 있습니까? 여기 CakePHP 2.0에서 페이지 매김

내 ThreadsController 여기

public function view($id = null) { 
    $this->Thread->id = $id; 
    $this->paginate = array(
     'conditions' => array(
      'thread_id' => $id, 
     ), 
     'order' => array(
      'Post.id' => 'DESC') 
    ); 
    if (!$this->Thread->exists()) { 
     throw new NotFoundException(__('Invalid thread')); 
    } 

    $this->set('thread', $this->Thread->read(null, $id)); 
    $this->set('posts', $this->paginate('Post')); 
} 

의 코드는 모두 25000 행에 영향을주는 SQL 쿼리입니다 :

Post을 선택합니다. id, Post. user_id, Post. post, Post. created, Post. modified, Post. thread_id FR ppv3. posts AS Post WHERE Post. thread_id = (1)

+0

코드 및 SQL 쿼리를 게시 하시겠습니까? 당신이 말한대로 모든 것에 영향을주는 것이 있다면 그것은 카운트 쿼리입니까? – tigrang

+0

이 (가) 내 질문을 편집했습니다. 불행히도 카운트 쿼리가 아닙니다. – napolin

+0

어딘가에 또 다른 쿼리가있는 것처럼 보입니다 ... 페이지 생성이 어떤 이유로 주문을 무시한 경우를 제외하고 해당 작업에서 가지고있는 것 중 아무 것도 해당 쿼리를 생성해서는 안됩니다. – jeremyharris

답변

1

당신의 쿼리를보고 나서 cakePHP 커스텀 페이지 매김 방법을 사용해야합니다. Cakephp Custom Query Pagination. 기본 페이지 매김 메서드를 재정의 할 수 있습니다. 희망이 있습니다

+0

해답을 주셔서 감사합니다. 그러나 해결책은 단지 한 줄에 불과합니다. "$ this-> Thread-> recursive = 0;" – napolin

0

페이지 매김에서 "제한"을 정의하지 않았다는 것을 제외하고는 모든 것이 코드에서 가능합니다. 즉, 단일 페이지에 대해 가져올 레코드의 수를 지정하십시오. 당신을 위해 일을하지 않을 경우

public function view($id = null) { 
$this->Thread->id = $id; 
$this->paginate = array(
    'limit' => 20, // this was the option which you forgot to mention 
    'conditions' => array(
     'thread_id' => $id, 
    ), 
    'order' => array(
     'Post.id' => 'DESC') 
); 
if (!$this->Thread->exists()) { 
    throw new NotFoundException(__('Invalid thread')); 
} 

$this->set('thread', $this->Thread->read(null, $id)); 
$this->set('posts', $this->paginate('Post')); 
} 

가 친절하게 질문해야

컨트롤러의 방법처럼 보인다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다.하지만 '제한'을 정의하는 것은 아무런 개선이 아닙니다. – napolin