php - ZF2 分页不适用于 Union

标签 php mysql pagination zend-framework2 union

我正在使用 PHPZend Framework 2.3.3。我将 Paginator 用于带有 Union 的 Select。 代码是这样的:

        $where = new Where();
        $where->like('value', "%$infoToSearch%");
        $select = new Select();
        $select->columns(array(new Expression('DISTINCT(id)')));
        $select->from('products');
        $select->where($where);

        $select2 = new Select();
        $select2->columns(array(new Expression('DISTINCT(id)')));
        $select2->from('products_archive');
        $select2->where($where);

        $select->combine($select2);

        $paginatorAdapter = new DbSelect($select, $this->getAdapter());
        $paginator = new Paginator($paginatorAdapter);

        $paginator->setCurrentPageNumber(1);
        $paginator->setItemCountPerPage(10);

        foreach($paginator as $product){
                var_dump($product);
        }

然后我得到错误的产品数量。我检查了 mysql 查询日志,看到了这个查询:

( SELECT DISTINCT(id) AS Expression1 FROM `products` WHERE `value` LIKE '%3%' LIMIT 10 OFFSET 0 ) UNION ( SELECT DISTINCT(id) AS Expression1 FROM `products_archive` WHERE `value` LIKE '%3%' )

如您所见,LIMIT 10 OFFSET 0 位置错误。它应该在查询的末尾。是Bug还是有什么办法可以解决这个问题?

最佳答案

发生这种情况是因为选择被传递给联合的第一部分的分页适配器,因此限制子句应用于该部分。为了允许将限制子句应用于联合的结果,需要一个新的 SQL\Select 实例,这与 Ralph Schindler 之前解决的这个问题非常相似 https://github.com/zendframework/zf2/issues/5162#issuecomment-36294281 .

为了解决这个问题,您需要像这样传递一个新的选择对象:

$union = (new \Zend\Db\Sql\Select)->from(['sub' => $select]);
$paginatorAdapter = new DbSelect($union, $this->getAdapter());

关于php - ZF2 分页不适用于 Union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30231772/

相关文章:

php - 图像未从本地主机服务器显示

php - 如何从数据库创建 JSON 树

javascript - 使用复选框提交表单

java - 如何返回仅包含短页面信息的分页代码?

javascript - WooCommerce 中的 "SyntaxError: Unexpected token <"?

php - 使用 php_mysql_xdevapi 出现无效数据包类型错误

mysql - 创建存储在元表中的报告值

mysql - 如何在 MySQL 中将 varchar 日期转换为日期时间

css - 添加内容第 nth-child 到分页

node.js - 使用 datatable 或仅使用 mongoose 进行表分页