CakePHP:在模型中与搜索逻辑分页

时间:2012-04-18 20:01:43

标签: php cakephp pagination cakephp-appmodel

我在分页搜索结果时遇到问题。我的设置如下。

我在myapp.com/searches/products的搜索表单中有视图(有搜索表单).../app/views/searches/products.ctp。我正在使用Searches控制器,该控制器使用Product模型进行此搜索查询。 Product具有搜索逻辑search())的操作$this->find(...)。搜索结果显示在视图中的表单下方。

如何执行与$this->paginate()类似的操作,这通常在控制器中完成?另外,我想知道我的设置是否有问题,特别是包含表单和搜索结果的视图。

2 个答案:

答案 0 :(得分:3)

将搜索逻辑保留在模型中并且仍在控制器中分页的一种方法是执行此操作:

<强>解释

不是从模型中返回实际的结果,而是返回任何/所有查找选项,然后像往常一样进行分页。对于某些示例,如下面的简单示例,它可能看起来有点过分,但它为find()containordergroupjoins添加了更多选项留出了空间。 ,conditionsfind() ...等等。并且更加符合“Fat Models,Skinny Controllers”的口头禅。

使用这样的选项设置/* 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; } } 也很不错,因此它可以在整个网站中轻松重复使用 - 只需传递不同的选项,就可以了。

<强>代码:

{{1}}

有一些方法可以用更简洁/更少的代码编写代码 - 但我喜欢这样编写代码,因此很容易理解。

(整体结构似乎没有任何问题。)

答案 1 :(得分:0)

我通常用来在会话中存储搜索参数并处理控制器操作中的所有内容。

function indexbystatus() {
    $this->set('title_for_layout','List Assets by Status');
    $this->Session->write('sender',array('controller'=>'assets','action'=>'indexbystatus'));
    $searchkey=$this->Session->read('Searchkey.status');
    $conditions='';
    if($searchkey) {
        $conditions=array('Asset.status_id'=>$searchkey);
    }
    if(!empty($this->data)) {
        // if user has sent anything by the searchform set conditions and
        // store it to the session but if it is empty we delete the stored
        // searchkey (this way we can reset the search)
        if($this->data['Asset']['status_id']!='') {
            $conditions=array('Asset.status_id'=>$this->data['Asset']['status_id']);
            $this->Session->write('Searchkey.status',$this->data['Asset']['status_id']);
        } else {
            $this->Session->delete('Searchkey.status');
            $conditions=null;
        }
    } else if($searchkey) {
        // if no data from the searchform we set the stored one
        // from the session if any
        $this->data['Asset']['status_id']=$searchkey;
    }
    $this->paginate=array(
                        'limit'=>25,
                        'order'=>array('Asset.status_id'=>'asc'),
                        'conditions'=>$conditions,
                        );
    $this->set('assets',$this->paginate());
    $statuses=$this->Asset->Status->find('list');
    $this->set('statuses',$statuses);
}

我更喜欢在控制器动作中处理它而不是在模型中处理它所以我可以通过动作获得不同的解决方案和逻辑。