我发现在我的一些控制器方法中,我必须对结果进行分页,只有一两个条件在方法之间发生变化。我还需要选择不分页。作为一个完整的编程新手,我想练习DRY,所以我开始学习如何在我在控制器中编码之前为可能的分页准备我的模型。我开始根据this Stack Overflow question中的答案在我的模型中构建查询。不幸的是,提出问题的人没有包含他们代码的第一部分,所以我真的不知道他们的模型查询的第一部分是什么样的。当我使用下面的代码时,我在Model上得到两个非法的偏移类型错误。以下是我的型号代码:
<?php class Unit extends AppModel {
public $name='Unit';
public $actsAs = array('Containable');
public $belongsTo=array(
'User',
'Complex',
'Location',
);
public $hasOne=array(
'Image'
);
function getListings() {
$paginate=array();
$qOptions=array();
$this->contain(array(
'User'=>array('id'),
'Location',
'Complex',
'Image'
)
);
if($paginate) {
return $qOptions;
}
else {
$data= $this->find('all', $qOptions);
return $data;
}
}
}
?>
这是我的控制器方法:
<?php
class LodgingsController extends AppController {
public $name='Lodgings';
public $layout='pagelayout';
public $uses=array('User', 'Unit', 'Location');
public $helpers=array('Text','Html','Js','GoogleMapV3');
public $paginate=array();
public function debug() {
$qOptions=array('conditions'=>array('Unit.active'=>1, 'Unit.type'=>'condo'), 'limit'=>9, 'order'=>array('Unit.id'=>'asc'));
$opts['paginate'] = true;
$paginateOptions=$this->Unit->getListings($opts);
$this->paginate=$paginateOptions;
$stuff=$this->paginate('Unit');
$this->set('units', $stuff);
}
}
?>
答案 0 :(得分:1)
我个人认为你尝试这样做的方式有很多开销。该模型非常简单,可以从控制器中调用分页。我的第一选择是将它保留在控制器中。如果逻辑更复杂,我会说移动它。但你正在做的是直截了当。我将如何在控制器中执行此操作。
<?php
function yourFunction() {
$this->Model->recursive = -1;
if ($paginate == 'true') {
$this->set('models', $this->paginate(set_options_here));
} else {
$this->set('models', $this->Model->find('all', array(set_options_here));
}
}
?>