CakePHP:对相关hasMany字段的查询约束进行分页?

时间:2011-09-20 17:50:18

标签: php cakephp pagination

this question类似 - 但由于我对CakePHP的无能,我似乎无法弄清楚这一点。这是我的设置。

我的模型名称User有很多Comments。我想要一个包含至少一个Users的所有不可见Comment的列表。我们的控制器设置了方法,将records设置为$this->paginate(),而不传递任何值;相反,$paginate var设置了条件和类似的东西。

class UsersController extends AppController {
    var $name = 'Users';
    var $paginate;

    function new_users() {
        $this->User->recursive = 1;
        $this->paginate['User']['contain'][] = 'Comment';
        $this->paginate['User']['order'] = 'User.DateCreated DESC';

        $conditions = array();
        // Get invisible users...
        $conditions[] = array('User.Status = ?' => 'Invisible');
        $conditions[] = array('User.Enabled' => true);
        // ...with at least one active comment
        $conditions[] = array('Comment.Status' => 'Active');

        // Load these conditions and fire pagination to render the view
        $this->paginate['User']['conditions'] = $conditions;
        $this->set('records', $this->paginate());
    }
} 

我是CakePHP的新手,很多东西仍然在我脑海中。我只想要一个活跃Users的{​​{1}}列表。现在,这个查询让我有0个用户。如果我删除关于Comments的行,则查询会完成,但无论是否有评论,我都会看到Comment.Status

我在网上看到Users电话的所有地方都已经传递给它了(比如paginate(),我已经尝试过了,并且没有给我任何东西)。

编辑:我有以下代码,虽然更干净,仍然给我相同的结果。

paginate('User', array('Comment.Status' => 'Active'))

1 个答案:

答案 0 :(得分:2)

我通常在飞行中使用分页更改。这是一些示例代码。

$this->paginate = array(
    'conditions' => array('Recipe.title LIKE' => 'a%'),
    'limit' => 10    );
$data = $this->paginate('Recipe');

Here您可以阅读有关分页的控制器设置的更多信息。但是如果你已经在模型中有关联(hasMany等),那么如果你将递归放到1而不需要包含(你仍然可以使用它来获取你想要的数据),则会自动获取数据。它将如何寻找你的一个例子:

$this->paginate = array(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true
    ),
    'contain' => array('Comment' => array(
           'conditions' => array('Comment.Status' => 'Active')
    )),
    'recursive' => 1,
    'order' => 'User.DateCreated DESC'
);
$data = $this->paginate('User');

这是你在帖子中添加的内容。如果你粘贴你想要的sql查询,我可以帮助你更多。另外,请尝试检查sql输出,以便了解条件是否有问题。如果您没有并且不知道如何放置sql输出就行了。

var_dump($this->User->getQuery(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true,
         'Comment.Status' => 'Active'
    ),
    'contain' => 'Comment',
    'order' => 'User.DateCreated DESC'
));

希望它可以帮助你,如果没有,请给我留言。

编辑:这是您需要做的事情,以获得您想要的。 :D更改表格和条件以满足您的需求。

$this->paginate = array(
    'conditions' => array(
         'User.Status' => 'Invisible',
         'User.Enabled' => true
    ),
    'joins' =>  array(
        array(
          'table' => 'name_of_comment_table',
          'alias' => 'Comment',
          'type' => 'inner',
          'conditions' => array(
              'Comment.user_id = User.id',
              'Comment.Status' => 'Active'
           )
         )
     ),
    'contains' => array('Comment'),
    'group' => 'User.id',
    'recursive' => 1,
    'order' => 'User.DateCreated DESC'
);
$data = $this->paginate('User');