分离模型函数的结果

时间:2014-10-30 18:18:12

标签: cakephp pagination

对于CakePhp 2.5

我的控制器中有以下搜索功能。

 public function search($query = null, $lim = null)
{
    $tokens = explode(" ", $query);
         $this->Paginator->settings = array(
                    'conditions' => array(
                        'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'],
                        'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%'
                    ),
                    'limit' => $lim
                );
         $this->set('customers', $this->Paginator->paginate());
}

这样可以正常工作,并获得我想要的结果。

然而,有人向我建议我应该将这些搜索功能放在我的模型中。我可以很容易地做到这一点,并且在我的模型中完成了类似的操作:

 public function getActiveTasks($id){
        return $this->Task->find('all', array(
            'conditions' => array(
                'Task.customer_id' => $id,
                'Task.status' => 0
            ),
            'order' => array('Task.due_date ASC'),
            'recursive' => -1,
        ));
    }

我遇到的问题是我不能(或不知道如何)使用Paginator进行自定义搜索。有没有办法从自定义函数中分页结果?

即,我可以执行以下操作:

 public function CustomModelSearch($query = null, $lim = null)
{
    return $this->Task->find('all', array(
        'conditions' => array(
            'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'],
            'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%'
        ),
        'limit' => $lim
    ));
}

然后在控制器调用中

$results = $this->Model->CustomModelSearch($query, $lim);
$this->set('results',$this->Paginate($results));

我找不到将结果传递给paginator以将分页结果呈现给视图的方法,除非我按照第一段代码通过控制器使用它,我被告知这不是很好的MVC原则。

2 个答案:

答案 0 :(得分:1)

要创建自定义分页,您有两种选择:

  • 使用paginatepaginateCount功能创建Custom Query Pagination

    //在行为上实现paginate和paginateCount。 public function paginate(Model $ model,$ conditions,$ fields,$ order,$ limit,     $ page = 1,$ recursive = null,$ extra = array()){     //方法内容 }

    public function paginateCount(Model $ model,$ conditions = null,$ recursive = 0,     $ extra = array()){     //方法体 }

  • 或创建custom find并设置Paginator以使用该查找。

答案 1 :(得分:0)

很好理解,但事实应该告诉我,你正在做的事情会让你遇到错误。

“任务”模型中的功能你不应该$this->task->find只是$this->find如果你在模型中不需要指定你正在使用的模型,你只需要这样做控制器。

模型/ Task.php:

public function CustomModelSearch($query = null, $lim = null)
{
    return $this->find('all', array(
        'conditions' => array(
            'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'],
            'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%'
        ),
        'limit' => $lim
    ));
}