1

我想列出给定用户的帖子。它有效,但分页不准确。

我的代码如下

public function index($userid = null) {

     if ($this->Post->exists($userid)) {

        $this->set('posts',$this->Post->find('all',array('conditions'=>array('user_id'=>$userid))), 
            $this->paginate());

        } else
        {

        $this->Post->recursive = 0;
        $this->set('posts', $this->paginate());
    }

结果给出了正确的列表 --> 3 个帖子,但分页器显示页码 1 和 2

你能帮助我吗?谢谢

4

3 回答 3

3

参考文档

问题中的代码很混乱。

寻找

find方法只有两个参数:

查找(字符串 $type = 'first',数组 $params = 数组())

第三个参数(调用 paginate 的结果)未使用并将被忽略 - 但它将根据paginate 调用中使用的条件为分页助手设置视图变量 - 没有使用任何条件。

无法对 find 调用的结果进行分页 - 这样做可以重构代码以调用 paginate 而不是 find。

分页

paginate方法只是paginator 组件代理- 它可以以多种方式使用,这一种(控制器代码示例):

$this->分页($条件)

对于问题中的情况最合适的用法是,即完整的操作代码应该类似于:

public function index($userId = null) {
    $conditions = array();
    if ($userId) {
        $conditions['Post.user_id'] = $userId;
    }
    $this->set('posts',$this->paginate($conditions));
}

请注意,从逻辑上讲,如果请求的用户 ID 不存在,则响应应该是空的 - 不是所有的。

于 2013-08-22T14:13:25.043 回答
1

我很确定分页条件现在确实可以这样工作。

如果你想为分页设置条件,你应该这样做:

$this->paginate = array('conditions' => array('Post.user_id' => $userid)));
$this->set('posts', $this->paginate());

是的,存储在$posts( in view ) 中的结果将是正确的,因为您为其分配了正确的查找结果,同时您已经在没有任何条件的情况下对模型进行了分页。

于 2013-08-22T13:12:24.357 回答
0

首先,您正在检查帖子是否存在,但使用$userid. 您是否试图查看“如果用户存在,获取该用户的帖子,或者获取所有用户的帖子”?正如您现在拥有的那样,假设您拥有$userid = 159, 但是max Post.id in your database is 28, 那么条件不被满足,因为它正在检查是否存在 aPost with the id = 159存在,但它不存在。

第二,你的条件不对。您正在执行查找,然后执行分页,这是两个单独的查询。条件是在查找查询而不是分页上实现的,但您只显示查找结果。

public function index($userid = null) {
    // setting recursive outside of if statement makes it applicable either way
    $this->Post->recursive = 0;

    // check if user exists
    if ($this->Post->User->exists($userid)) {
        // get posts for user
        $this->set('posts', $this->paginate('Post', array('Post.user_id' => $userid));
    }
    else{
        // get all posts
        $this->set('posts', $this->paginate('Post'));
    }    

} // end index function
于 2013-08-22T13:12:58.477 回答