Cake Php paginator问题

时间:2016-08-18 11:08:42

标签: php cakephp pagination cakephp-2.0 paginator

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

//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' 我也清除了缓存。 任何帮助表示感谢,谢谢。

2 个答案:

答案 0 :(得分:2)

如果您的代码在本地计算机上正常运行但未在生产环境中运行,则必须清除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'));
}

OR

// 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'));
}

答案 1 :(得分:2)

我已修复问题,此问题是由于data type已声明进入数据库。在生产中它是tinyint(1),在开发过程中它给出了int(1)。它在两个环境中都在数据库中保存了正确的值,但条件tinyint(1)仅使用0& 1不是2。

我不明白这背后的原因。