从CakePHP中的模型中分页

Dav*_*ave 9 cakephp model paginate cakephp-1.3

我在我的函数Event模型叫做getEvents-你可以通过限制,start以及end日期fields,event types和事件subtypes.

我看,paginate能接受我使用喜欢的所有参数joins,conditions,limit...等等就像一个正常find即可.

当我不尝试分页时,它返回数据就好了.但是 - 我希望能够传递一个paginate变量来告诉它而不是这样做:

$this->recursive = -1;
$data = $this->find('all', $qOptions);
Run Code Online (Sandbox Code Playgroud)

去做这个:

$this->recursive = -1;
$data = $this->paginate($qOptions);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试时,它给了我很多错误.如果需要,我可以稍后指定错误 - 现在,我想我正在寻找 - 这是可以做到的吗?如果是这样,怎么样?

有没有更好的方法来做这样的事情?我花了足够的时间让这个功能做我想要的,并允许所有选项传递...等 - 如果我不能用它进行分页,这似乎是浪费.但是 - 如果它不理想,我也能听到.提前致谢.

编辑:

我正在网上阅读其他内容,说你不应该在你的模型中使用paginate,因为它是从URL变量中提取的,这会破坏MVC结构的目的.这是有道理的,但这是否意味着我必须在模型和控制器中编写相同的连接/查询?在每一个需要的行动中?

Dav*_*ave 10

我想出如何find在模型中保留我的复杂而不必在控制器中第二次重写它的方式是通过传递一个$paginate布尔变量.

如果$paginate为true,则仅返回创建的选项,然后可以在控制器的分页中使用.如果它是假的(意味着我们不想分页),它将返回实际的事件结果.到目前为止,这似乎有效.

在我的getEvents()函数中(此方法在Events模型中)

    if($paginate) {
        return $qOpts; // Just return the options for the paginate in the controller to use
    } else {
        $data = $this->find('all', $qOpts); // Return the actual events
        return $data;
    }
Run Code Online (Sandbox Code Playgroud)

然后,在我的事件/索引(事件控制器,索引操作 - 我知道我想要分页):

$this->Event->recursive = -1; // (or set recursive = -1 in the appModel)
$opts['paginate'] = true;

$paginateOptions = $this->Event->getEvents($opts);

$this->paginate = $paginateOptions; // Set paginate options to just-returned options
$data = $this->paginate('Event'); // Get paginate results
$this->set('data', $data); // Set variable to hold paginated results in view
Run Code Online (Sandbox Code Playgroud)