Cake Php 分页器问题
Cake Php paginator issue
我遇到了一个奇怪的问题。我已经编写了分页代码。一切都按预期工作,但只有条件不工作(仅某些条件)
这是我的分页代码。
//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');
此代码在开发环境和 return 具有类型 2 的日志上运行完美,但在生产环境中它 return 仅在具有类型 1 的日志上运行。我花了一整天的时间来找出问题.
如果我确实在 conditions array
中添加了任何其他确实有效但没有 log_type
的条件。
我打印查询日志,在 where clause
它总是显示 log_type = '1'
我也清除了缓存。
任何帮助表示赞赏,谢谢。
如果您的代码在本地机器上工作正常但在生产环境中不工作,那么您必须清除 tmp/cache/model
和 tmp/cahe/persistance
中的所有文件。确保您已授予 tmp
文件夹的可写权限。
这意味着当您添加新字段、删除现有字段或对数据库架构进行任何更改时,您必须更新 Cake 模型架构。在生产模式下,如果未找到模式缓存文件,那么它将根据数据库中的当前模式创建新的缓存文件。在每次执行的开发模式下,它都会更新模式缓存。
它的分页问题仍然存在,那么您必须遵循 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'));
}
我已经解决了问题,这个问题是由于 data type
声明到数据库中造成的。在生产中它是 tinyint(1)
,在开发中它是 int(1)
。它在两种环境中都在数据库中保存了正确的值,但在条件 tinyint(1)
中仅使用 0 和 1 而不是 2。
我不明白这背后的原因。
我遇到了一个奇怪的问题。我已经编写了分页代码。一切都按预期工作,但只有条件不工作(仅某些条件) 这是我的分页代码。
//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');
此代码在开发环境和 return 具有类型 2 的日志上运行完美,但在生产环境中它 return 仅在具有类型 1 的日志上运行。我花了一整天的时间来找出问题.
如果我确实在 conditions array
中添加了任何其他确实有效但没有 log_type
的条件。
我打印查询日志,在 where clause
它总是显示 log_type = '1'
我也清除了缓存。
任何帮助表示赞赏,谢谢。
如果您的代码在本地机器上工作正常但在生产环境中不工作,那么您必须清除 tmp/cache/model
和 tmp/cahe/persistance
中的所有文件。确保您已授予 tmp
文件夹的可写权限。
这意味着当您添加新字段、删除现有字段或对数据库架构进行任何更改时,您必须更新 Cake 模型架构。在生产模式下,如果未找到模式缓存文件,那么它将根据数据库中的当前模式创建新的缓存文件。在每次执行的开发模式下,它都会更新模式缓存。
它的分页问题仍然存在,那么您必须遵循 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'));
}
我已经解决了问题,这个问题是由于 data type
声明到数据库中造成的。在生产中它是 tinyint(1)
,在开发中它是 int(1)
。它在两种环境中都在数据库中保存了正确的值,但在条件 tinyint(1)
中仅使用 0 和 1 而不是 2。
我不明白这背后的原因。