基于可包含关系的Cakephp分页

基于可包含关系的Cakephp分页,php,cakephp,pagination,cakephp-2.0,Php,Cakephp,Pagination,Cakephp 2.0,我有一个模型协会,其工作原理如下: Users hasAndBelongsToMany Tags $this->paginate = array( 'conditions' => $conditions, 'contain' => array('User'), 'limit' => 5, ); $this->paginate('Tag') 我希望能够根据一组用户的标签对其进行分页。用户可以有许多标签,请求的过滤器可能很复杂,即查询

我有一个模型协会,其工作原理如下:

Users hasAndBelongsToMany Tags
$this->paginate = array(
    'conditions' => $conditions, 
    'contain' => array('User'), 
    'limit' => 5, 
);

$this->paginate('Tag')
我希望能够根据一组用户的标签对其进行分页。用户可以有许多标签,请求的过滤器可能很复杂,即查询可以询问所有带有标签
a
B
但不
C
的用户。通过对标记使用分页(以便条件数组可以应用于标记模型)并返回该标记子集中的用户,可以更容易地处理此问题

尝试分页时会出现问题,因为我按如下方式设置分页:

Users hasAndBelongsToMany Tags
$this->paginate = array(
    'conditions' => $conditions, 
    'contain' => array('User'), 
    'limit' => 5, 
);

$this->paginate('Tag')

因此,分页完全按照预期进行,它返回基于标记的分页数组,但我想要的是由用户分页。将分页切换为取决于用户会产生自己的一组问题(“这就是我以前使用的”)。像这样的模型关联是否存在分页?我觉得这是cakephp可以做的事情。感谢所有帮助您的人。

将此项放入模型中

function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
        $parameters = compact('conditions');
        $this->recursive = $recursive;
        $count = $this->find('count', array_merge($parameters, $extra));
        if (isset($extra['group'])) {
            $count = $this->getAffectedRows();
        }
        return $count;
    }

您应该使用自定义查找器:。在用户模型中创建受保护函数的示例中:

protected function _findUsersByTag($state, $query, $results = array()) {
    if($state == 'before') {
       $query['joins'] = array(
          'Tag' => array('type' => 'inner', 'alias' => 'Tag', 'table' => 'tags', 'conditions' => array('Users.tag_id = Tag.id')
       );
     return $query; 
    }

    return $results;
}
第二个外接程序用户模型:

public $findMethods = array('usersByTag' =>  true);
在控制器中,您定义分页以使用自定义查找程序,使用数组的0索引,或在2.3和更高版本的属性findType中:

public $pagination = array('User' => array(
   'usersByTag',
   'limit' => 5, 
   'conditions' => $conditions
)); 

你能不能换一种方式,把一个条件放进去,这样就可以通过它的标签来选择
User
?@scrowler不,我试过了,它会产生自己的一系列问题。这是一个解决方法,我想我需要重写分页方法,但我还不确定如何做。好的,这看起来很有趣,也很有用。我正在四处寻找如何调用这个paginateCount方法。我怎样才能确保这一个是用来代替蛋糕的?