将搜索逻辑保留在模型中并仍然在控制器中分页的一种方法是执行以下操作:
解释:
而不是从模型返回实际结果,只需返回任何/所有 find options,然后像往常一样进行分页。find()
对于一些示例,例如下面这个简单的示例,它可能看起来有点矫枉过正,但它为您的like contain
, order
, group
, joins
, ... 等添加更多选项留下了空间conditions
。并且更符合“Fat Models,瘦身控制器”的口头禅。
使用这样的选项设置您find()
的 s 也很不错,因此它可以在您的整个站点中轻松重复使用 - 只需传递不同的选项,您就可以开始了。
代码:
/* CONTROLLER
*/
$opts = array('paginate' => true, 'limit'=>20);
$paginateOptions = $this->Event->getEvents($opts);
$this->paginate = $paginateOptions;
$data = $this->paginate('Event');
/* MODEL
*/
public function getProducts($opts = null) {
$params = array();
//limit
$params['limit'] = 50; //default
if(!empty($opts['limit'])) $params['limit'] = $opts['limit'];
//paginate option
$paginate = false;
if(isset($opts['paginate'])) {
if($opts['paginate']) $paginate = true;
}
//either return the options just created (paginate)
if($paginate) {
return $qOpts;
//or return the events data
} else {
$data = $this->find('all', $qOpts);
return $data;
}
}
有一些方法可以编写更苗条/更少的代码行 - 但我喜欢这样写,所以它很快就可以理解。
(您的整体结构似乎没有任何问题。)