【问题标题】:Cakephp Paginate FindCakephp 分页查找
【发布时间】:2013-08-22 12:46:59
【问题描述】:

我想列出给定用户的帖子。它可以工作,但分页不准确。

我的代码如下

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

你能帮帮我吗? 谢谢

【问题讨论】:

    标签: cakephp pagination


    【解决方案1】:

    参考文档

    问题中的代码比较混乱。

    找到

    find 方法只有两个参数:

    find(string $type = 'first', array $params = array())

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

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

    分页

    paginate 方法只是 proxypaginator component 的一个 proxy - 它可以以多种方式使用,这个(控制器代码示例):

    $this->分页($conditions)

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

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

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

    【讨论】:

    • @bowlerae 这两个答案都没有重复;)
    • 我想为这两个回复投票,但系统不允许。我只能投票支持 1 个解决方案,抱歉。感谢你们俩
    • 其实是的,我有点不高兴。我努力及时提供正确的答案,指出一个其他答案都没有指出的问题,像您所做的那样解释 find vs paginate 中的错误,并向用户提供解释。我删除了您可能认为是“咆哮”的两句话,但我不明白为什么这个答案比其他两句话更受欢迎。
    • @bowlerae 解决咆哮:首先,您的答案关注的是人,而不是代码。里面有大量的“你”。其次,它非常具有指责性。 </end simulated rant>。请注意,此文本基于您的回答。我选择回答是因为既不 现有回复澄清了您可以 直接将条件传递给分页,或者明确表示不可能以某种组合调用 find 和 paginate。 OTOH 会有多个答案。如果您仍然有一些疑虑/怀疑,我建议您询问元数据,但我感谢您澄清您的动机。
    • "您可以直接将条件传递给分页或明确不能以某种组合调用 find 和 paginate。" johnniedoe 和我都解释了如何通过条件来分页。我还指出了同时使用 find 和 paginate 但只显示 find 的缺陷。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      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
      

      【讨论】:

      • 我会赞成你指出用户 ID 逻辑错误的答案 - 但其中有太多的咆哮 =)。
      • 谢谢,您的代码运行良好。实际上,当一个非用户点击链接运行索引功能时,他得到了所有的帖子,当他连接时,他得到了自己的帖子列表。这就是我想做的。 Userid 包含已连接用户的 id。
      • @AD7six 大声笑必须给出解释,而不是咆哮......拿出我的一些“解释”:)
      • 如果这是你想要的user2402436,那么你可以检查用户是否登录,然后使用条件'Post.user_id' => $this->Auth->user('id')
      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多