CakePHP 自定义查询分页器:不调用自定义分页函数


CakePHP custom query paginator: custom paginate function is not called

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

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 和 paginateCount 函数。沃兹.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'));
}

但是不会调用自定义分页器,它继续调用默认分页函数。为什么?

按照dragmosh建议(谢谢),我研究了CakePHP ORM自定义查询生成器。在这个解决方案中,我在调用默认分页器后使用了带有特定选项的 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']);