【问题标题】:Zend Paginator displays wrong page count when query has "distinct"Zend Paginator 在查询有“不同”时显示错误的页数
【发布时间】:2010-10-09 09:51:27
【问题描述】:

我在一个项目中使用 Zf 1.10,并且一直使用 Zend_Paginator 和 Zend_DbTable 查询非常成功,直到现在。

查询需要一个 DISTINCT 关键字来删除由连接创建的重复行,但是当我添加它时,当实际上只有一页结果时,分页器会错误地显示两页结果的导航。一些挖掘表明它正在执行两个查询,一个用于我之后的结果集(77 行),另一个用于获取计数。但是 Zend 魔法生成的第二个查询不包含 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;

除了忽略计数查询中的 DISTINCT 子句之外,它生成的查询没有任何问题。如果您删除 ->distinct() 位,一切都会很好 - 112 行并且分页都是超级的,除了数据有重复的行。

我看到关于类似问题的错误报告以公平的方式返回,但它们在早期版本的 ZF 中被标记为已修复

?这是一个已知的陷阱吗?如果不写自己的分页,我能做些什么吗?并不是说写分页特别有挑战性,但这意味着这部分会与项目的其他部分不一致

非常感谢

伊恩

编辑 - 找到了一个解决方法,发布为下面的答案。

【问题讨论】:

    标签: php mysql zend-framework zend-paginator


    【解决方案1】:

    这是很久以前的问题了,但仍然需要答案。

    您应该在控制器中使用 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...
    

    【讨论】:

    • 嗨 - 谢谢你 - 下次我更新这个项目时,我会试试这个。为不厌其烦地回答这么老的问题点赞
    • 先更新ZF,如果还是不能解决问题,可以执行命令:grep -r -l "paginator" * 查找该代码在哪里并修改...或者设置ZFDebug记录该查询的位置......但无论如何你必须更改代码
    【解决方案2】:

    找到一个简单的解决方法...不要使用 DbTable 适配器,而是将结果放入一个数组中,然后将其传递给分页器

    $results = $this->fetchAll($select)->toArray(); 
    $adapter = new Zend_Paginator_Adapter_Array($results);
    

    似乎只有 DbTable 有这个错误。

    祝你好运!

    【讨论】:

    • 然后您将检索所有结果并将它们存储在一个效率不高的数组中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多