Cakephp分页问题

Posted

技术标签:

【中文标题】Cakephp分页问题【英文标题】:Cake Php paginator issue 【发布时间】:2016-12-25 07:02:23 【问题描述】:

我正面临一个奇怪的问题。我已经编写了分页代码。一切都按预期工作,但只有条件不起作用(只有某些条件) 这是我的分页代码。

//declaration 
public $paginate = array(
        'limit' => 50,
        'paramType' => 'querystring'
    ); 
//use in action
$this->paginate['ApiLog'] = array('limit' => 50, 'order' => 'ApiLog.id DESC', 'paramType' => 'querystring');

$this->paginate['ApiLog']['conditions'] = array('ApiLog.log_type' => 2);
$this->paginate['ApiLog']['joins'] = array(               
            array(
                'table' => 'users',
                'alias' => 'User',
                'type' => 'LEFT',
                'conditions' => array('User.id = ApiLog.user_id')
            )                
        );
$this->Paginator->settings = $this->paginate['ApiLog'];
$apilogs = $this->Paginator->paginate('ApiLog');

此代码在开发环境中运行良好,并返回类型为 2 的日志,但在生产中它只返回类型为 1 的日志。我花了一整天的时间来解决问题。 如果我确实在conditions array 中添加了任何其他条件,它确实生效但不是log_type。 我打印查询日志,在where clause 它总是显示log_type = '1' 我也清除了缓存。 任何帮助表示赞赏,谢谢。

【问题讨论】:

尝试删除你的tmp/cache文件夹 【参考方案1】:

如果您的代码在本地机器上运行良好但在生产环境中运行不正常,那么您必须清除 tmp/cache/modeltmp/cahe/persistance 中的所有文件。确保您已授予tmp 文件夹的可写权限。

这意味着当您添加新字段、删除现有字段或对数据库架构进行任何更改时,您必须更新 Cake Model 架构。在生产模式下如果找不到模式缓存文件,那么它将根据数据库上的当前模式创建新的缓存文件。在每次执行的开发模式下,它都会更新架构缓存。

仍然存在分页问题,​​那么您必须遵循 Cakephp 2.x 文档。在这里我假设你的代码在ApiLogsController,方法是index。根据文档,您的代码应该是。

public function index() 
    $this->Paginator->settings = array(
        'limit' => 50,
        'order' => 'ApiLog.id DESC'
        'paramType' => 'querystring',
        'conditions'=>  array('ApiLog.log_type' => 2),
        'recursive'=>-1, // should be used with joins
        'joins'=>array(
            array(
                'table'=>'users',
                'type'=>'LEFT',
                'alias'=>'User',
                'conditions'=>array('User.id = ApiLog.user_id')
            )
        )
    );
    $data = $this->Paginator->paginate('ApiLog');
    $this->set(compact('data'));

// your default setting in ApiLogController class
public $components = array('Paginator');
public $paginate = array(
    'limit' => 50,
    'paramType' => 'querystring'
);

public function index() 
// overriding/extending default settings

$this->Paginator->settings['order']='ApiLog.id DESC';
$this->Paginator->settings['conditions']=array('ApiLog.log_type' => 2),
$this->Paginator->settings['recursive']= -1;
$this->Paginator->settings['joins']=array(
        array(
            'table'=>'users',
            'type'=>'LEFT',
            'alias'=>'User',
            'conditions'=>array('User.id = ApiLog.user_id')
        )
    );

$data = $this->Paginator->paginate('ApiLog');
$this->set(compact('data'));

【讨论】:

我已经清除了缓存。我的 Paginator 设置也是正确的。我确实在设置中添加了任何其他条件然后它确实有效 使用调试级别 2 签入生产环境并在布局底部显示查询。 查询有四种显示方式: 这将显示用户模型执行的最后一个查询: debug($this->User->lastQuery());这将显示用户模型的所有执行查询: $log = $this->User->getDataSource()->getLog(false, false);调试($日志);这将显示所有查询的日志: $db =& ConnectionManager::getDataSource('default'); $db->showLog();如果您想在整个应用程序中显示所有查询日志,您可以在 view/element/filename.ctp 中使用。 element('sql_dump'); ?> 我见过查询,它总是在 where 子句中包含 ApiLog.log_type = '1' 您正在使用您的或我的选项 1 或选项 2 的哪个代码?【参考方案2】:

我已经解决了这个问题,这个问题是由于data type 声明到数据库中。在生产中它是tinyint(1),在开发中它是int(1)。它在两种环境中都在数据库中保存了正确的值,但在tinyint(1) 的情况下,只使用 0 和 1 而不是 2。

我不明白这背后的原因。

【讨论】:

以上是关于Cakephp分页问题的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp分页问题

Cakephp 分页按计算字段排序( COUNT )

CakePHP 2中带有分页分页类的大小为f数组的问题

cakephp分页多个habtm

如何在 cakePHP 的控制器中设置分页器页面

CakePHP 3:多订单导致分页?