CakePHP自定义查询分页器:不调用自定义分页功能

时间:2016-03-21 19:21:45

标签: php cakephp pagination

我构建了一个自定义查询,并尝试使用默认的分页器,如下所示:

WodsController.php

$userId = $this->Auth->user('id');
$connection = ConnectionManager::get('default');
$result = $connection->execute("SELECT  wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods
LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc limit 50")->fetchAll('assoc');
$results = array();
foreach ($result as $r) {
    $entity = $this->Wods->newEntity($r);
    array_push($results, $entity);
}
$wods = $this->paginate($results);
$this->set('_serialize', ['wods']);

我收到此错误"无法找到与paginate兼容的对象"。

现在我尝试实现自定义查询分页器,但它不起作用。 我在模型中实现了paginate和paginateCount函数。 Wods.php文件:

public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
    $recursive = -1;

    $this->useTable = false;
    $sql = '';

    $sql .= "SELECT  wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc limit ";

    // Adding LIMIT Clause
    $sql .= (($page - 1) * $limit) . ', ' . $limit;

    $results = $this->query($sql);

    return $results;
}
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {

    $sql = '';

    $sql .= "SELECT  wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc";

    $this->recursive = $recursive;

    $results = $this->query($sql);

    return count($results);
}

在控制器WodsController.php

public function index()
{
    $this->Wods->recursive = 0;

    $this->paginate = array('Wods'=>array('limit'=>10));

    $this->set('wods', $this->paginate('Wods'));
}

但是没有调用自定义分页符,它继续调用默认的分页功能。为什么?

1 个答案:

答案 0 :(得分:1)

按照dragmosh的建议(谢谢),我调查了CakePHP ORM自定义查询构建器。 在这个解决方案中,我在调用默认的paginator之后使用了find()函数和特定的选项:

$query = $this->Wods->find()
                ->select(['Wods.id', 'Wods.titulo','Wods.dia','Wods.rounds','Wods.tempo','Wods.repeticoes','Userwods.user_id'])
                ->join([
                        'table' => 'Userwods',
                        'alias' => 'Userwods',
                        'type' => 'LEFT',
                        'conditions' => 'Userwods.wod_id = Wods.id',
                ])
                ->where(function ($exp, $q) {
                    return $exp->isNull('Userwods.user_id');})
                ->orWhere(['Userwods.user_id' => 4])
                ->contain(['Userwods'])
                ->autoFields(true);
        $wods = $this->paginate($query);

        $this->set(compact('wods'));
        $this->set('_serialize', ['wods']);