0

我使用 CakePHP 2.x 并且有一个线程,其中包含许多帖子,我想对其进行分页。但是当我查看 sql-log 时,有一个 SELECT 语句会影响线程的所有帖子(25k)。实际上只显示了 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 查询:

选择Postid, Post. user_id, Post. post, Post. created, Post. modified, Post. thread_idppv3。在posts哪里。= (1)PostPostthread_id

4

2 回答 2

1

您应该查看您的查询,然后使用 cakePHP 自定义分页方法。Cakephp 自定义查询分页。您可以覆盖默认的分页方法。希望这可以帮助

于 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 回答