我在一个项目中使用Zf 1.10,并且已经非常成功地使用Zend_Paginator和Zend_DbTable查询,直到这一点。
查询需要DISTINCT关键字来删除由连接创建的重复行,但是当我添加它时,当实际上只有一页结果时,分页器错误地显示两页结果的导航。一些挖掘显示它正在执行两个查询,一个用于我追求的结果集(77行),另一个用于获取计数。但Zend magic生成的第二个查询不包含DISTINCT关键字,因此计数返回112行而不是77行。
这是相关位
$select = $this->select()
->setIntegrityCheck(false)
->from('companies')
->distinct()
->join('project_team', 'companies.companyID = project_team.companyID', null)
->join('project_team_roles', 'project_team.roleID = project_team_roles.roleID', null)
->join('projects', 'projects.projectID = project_team.projectID', null)
->where('project_team_roles.isArchitect')
->where('companies.companyName LIKE ?', '%' . $str . '%')
->where('projects.islive AND NOT projects.isDeleted')
->order('companies.companyName');
$adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
$paginator = new Zend_Paginator($adapter);
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(100);
return $paginator;
它生成的查询没有任何问题,除了它忽略了count查询中的DISTINCT子句。如果你删除了 - > distinct()位,那么一切都很好 - 112行和分页都是超级的,除了数据有重复的行。
我看到错误报告对类似问题采取了公平的方式但在早期版本的ZF中标记为已修复
?这是一个已知的问题吗?如果不写自己的分页,我能做些什么吗?写作分页并不是特别具有挑战性,但这意味着这一点与项目的其他部分不一致
非常感谢
伊恩
编辑 - 找到一种解决方法,发布如下答案。
答案 0 :(得分:2)
这是很久以前的问题,但它仍然需要答案。
您应该在控制器中使用setRowCount()方法。
$select = $your_model->getSelect();
$select_count = $your_model->getCount(); // geting count from select above
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
$adapter->setRowCount((int)trim($select_count)); // <-- // set integer !
$paginator = new Zend_Paginator($adapter);
// That's it
...
$this->view->paginator = $paginator;
// and so on...
答案 1 :(得分:0)
找到一个简单的解决方法...不要使用DbTable适配器,而是将结果放入数组中,然后将其传递给paginator
$results = $this->fetchAll($select)->toArray();
$adapter = new Zend_Paginator_Adapter_Array($results);
只有具有此错误的DbTable才会出现。
祝你好运!