我正在旧版 Cake PHP 2.10 应用程序中工作,并且正在利用 Pagination组件和PaginationHelper .
我必须重写 paginateCount
方法,为我的分页器设置设置自定义选项,以限制随后分页的查询结果的最大数量,limit
和maxLimit
本身还不够 - 我添加了 totalLimit
。
现在的问题是,如果结果少于我的totalLimit
,例如过滤时,它继续显示20,000,而不是实际结果的数量。我可以专门为此计数创建另一个查询,但想知道是否缺少一个快速解决方法,这是我的 Application
模型方法:
public function paginateCount($conditions = null, $recursive = 0, $extra = array())
{
if (isset($extra['totalLimit'])) {
return $extra['totalLimit'];
}
}
我的分页设置:
// define pagination settings
$this->Paginator->settings = array(
'Application' => array(
'paramType' => 'querystring',
'totalLimit' => 20000,
'limit' => $filters['pagination']['perPage'],
'maxLimit' => $filters['pagination']['perPage'],
'fields' => array(
'Application.*',
'ApplicationPayday.*',
'ApplicationApiLink.*',
'ApplicationResponse.*',
'AffiliateId.*',
'Redirect.*'
),
'joins' => array(
array(
'table' => 'tlp_application_paydays',
'alias' => 'ApplicationPayday',
'type' => 'LEFT',
'conditions' => array(
'ApplicationPayday.application_id = Application.id'
)
),
array(
'table' => 'tlp_application_api_links',
'alias' => 'ApplicationApiLink',
'type' => 'LEFT',
'conditions' => array(
'ApplicationApiLink.application_id = Application.id'
)
),
array(
'table' => 'tlp_application_responses',
'alias' => 'ApplicationResponse',
'type' => 'LEFT',
'conditions' => array(
'ApplicationResponse.application_id = Application.id'
)
),
array(
'table' => 'tlp_affiliate_ids',
'alias' => 'AffiliateId',
'type' => 'LEFT',
'conditions' => array(
'AffiliateId.aff_id = Application.tlp_aff_id'
)
),
array(
'table' => 'tlp_redirects',
'alias' => 'Redirect',
'type' => 'LEFT',
'conditions' => array(
'Redirect.application_id = Application.id'
)
)
),
'conditions' => $queryConditions,
'group' => array(
'Application.id'
),
'order' => array(
'Application.id' => 'desc'
),
'recursive' => -1
)
);
// run query to get applications via paginated settings
try {
$applications = $this->Paginator->paginate('Application');
} catch (\NotFoundException $e) {
$this->Session->setFlash("Page doesn't exist. We've reset your search filters and taken you to the first page.");
return $this->redirect('/payday_admin/leads/');
}
最佳答案
问题在于您将 paginateCounts
返回的总结果数替换为您设置的 $extra['totalLimit']
(本例中为 20.000)。
pagineCount()
函数应使用如下例所示的内容进行覆盖。这样,您将在 ->find('count', [])
参数中插入总限制,并且如果未发送 $extra['totalLimit'] 参数,则还保留原始计数。
public function paginateCount($conditions, $recursive, $extra)
{
if (isset($extra['totalLimit'])) {
$limit = $extra['totalLimit'];
unset($extra['totalLimit']);
$count = $this->find('count', compact($conditions, $recursive, $limit, $extra));
return (int)$count;
}
$count = $this->find('count', compact($conditions, $recursive, $extra));
return (int)$count;
}
您的计数将限制为 totalLimit
的最大值,但如果低于该值,则会返回真实计数。
如果您有数百万行且有很多连接,我建议缓存计数。可以通过散列条件和其他参数来创建缓存键。
这就是条件从模型类传递到重写的 paginateCount()
的方式。
$this->Paginator->settings = [
'limit' => 50,
'contain' => [
...
],
'conditions' => $conditions,
'joins' => $joins,
'group' => $group
];
$this->Paginator->paginate('Model');
关于php - 检索 Cakephp 2 分页中自定义限制的分页记录总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74095981/