0

私は CakePHP 2.x を使用しており、多くの投稿を含むスレッドがあり、これをページ分割したいと考えています。しかし、SQL ログを調べると、スレッドのすべての投稿 (25k) に影響する SELECT ステートメントがあります。実際には 20 件の投稿しか表示されていないため、このオーバーヘッドを回避する方法はありますか?

これが私の 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'));
}

25k 行すべてに影響する SQL クエリは次のとおりです。

選択しPostます。idPostuser_idPostpostPostcreatedPostmodifiedPostthread_idからppv3postsどこにPostでもPostthread_id= (1)

4

2 に答える 2

1

クエリを確認してから、cakePHP カスタム ページネーション メソッドを使用してください。Cakephp カスタム クエリ ページネーション. デフォルトの paginate メソッドをオーバーライドできます。お役に立てれば

于 2012-07-19T22:37:55.907 に答える
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'));
}

うまくいかない場合は、お気軽にお問い合わせください。

于 2012-07-20T04:55:24.760 に答える