php - 检索 Cakephp 2 分页中自定义限制的分页记录总数

标签 php cakephp pagination cakephp-2.0 cakephp-2.x

我正在旧版 Cake PHP 2.10 应用程序中工作,并且正在利用 Pagination组件和PaginationHelper .

我必须重写 paginateCount 方法,为我的分页器设置设置自定义选项,以限制随后分页的查询结果的最大数量,limitmaxLimit 本身还不够 - 我添加了 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/

相关文章:

php - 如何将 mysql 数据库中的选定值与另一个表中的现有值进行比较?

php - Laravel - 方法分页不存在

php - 使用 CakePHP 获取插入的 ID,无需使用模型

PHP 分页代码不起作用

php - https 上混合内容中的 iframe

php - 如何在android中使用sharedpreferences保存mysql数据表

php - Cakephp 3.4 总是将主键保存为 NULL

php - cakePHP 分页和 passedArgs

ios - 使用 UITableView 加载更多选项

API 请求一次调用所有页面?