cakephp Cake PHP 2.10限制模型记录分页

ukdjmx9f  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(142)

我正在一个Cake PHP 2.10应用程序中工作,需要为我的模型使用Cake paginator,以便为最终用户提供分页视图。
我面临的问题是,我需要将其他模型加入到我的Application模型中,比如ApplicationPayday,其中每个模型都有数百万行。
我的系统中的用户不需要看到数以百万计的分页结果,也许只需要看到最后1000个。
我已经在Paginator设置中添加了一个limit,但是Cake仍然从我的表中获取我的所有应用程序,我遗漏了什么?

// define pagination settings
$this->Paginator->settings = array(
        'limit' => 50, // <-- doesn't seem to be limiting at all?
        'maxLimit' => 5,
        'joins' => array(
                array(
                        'table' => 'tlp_application_paydays',
                        'alias' => 'ApplicationPayday',
                        'type' => 'inner',
                        'conditions' => array(
                                'ApplicationPayday.application_id = Application.id'
                        )
                ),
                array(
                        'table' => 'tlp_application_types',
                        'alias' => 'ApplicationType',
                        'type' => 'inner',
                        'conditions' => array(
                                'ApplicationType.id = Application.application_type'
                        )
                )
        ),
        'order' => array(
                'Application.id' => 'desc'
        ),
        'recursive' => -1
);

// run query to get applications via paginated settings
$applications = $this->Paginator->paginate('Application');

我正在做文档中所说的一切,也就是在分页器设置中定义limit,我在这里遗漏了什么?

ubby3x7f

ubby3x7f1#

实际上,您需要对第二个表ApplicationPayday的联接进行限制。如果使用联接,则无法做到这一点。innerjoin将选择所有匹配的数据。
您应该使用limit在两个表之间创建一个hasMany关系,如下所示。您可以使用bindModel动态创建它,如下面的示例所示(如果它尚未在模型类中定义)。

$this->Application->bindModel([
    'hasMany' => [
        'ApplicationPayday' => [
            'className' => 'ApplicationPayday',
            'foreignKey' => 'application_id',
            'limit'  => '5', // this one will work because CakePHP will make a separated query for each application_id, with limit
        ],
        ...
    ]
]);

$this->Application->contain([
    'ApplicationPayday',
    ...
]);

您可以阅读更多关于链接模型的信息:
https://book.cakephp.org/2/en/models/associations-linking-models-together.html#hasmany
containable特性可以帮助您限制find方法的返回值,而无需使用recursive
https://book.cakephp.org/2/en/core-libraries/behaviors/containable.html

相关问题