ZF2分页与Union无法配合使用。

3

我正在使用 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还是有解决问题的方法?

1个回答

3
这是因为选择器被传递到分页适配器的联合查询的第一部分,所以限制子句被应用于该部分。为了允许限制子句应用于联合查询的结果,需要一个全新的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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接