簡體   English   中英

ZF2分頁不適用於Union

[英]ZF2 Pagination does not work with Union

我在Zend Framework 2.3.3使用PHP 我用Paginator選擇Union 代碼是這樣的:

        $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還是有任何方法可以解決這個問題?

這是因為select被傳遞給union的第一部分的分頁適配器,因此limit子句應用於該部分。 為了允許將limit子句應用於union的結果,需要一個新的SQL \\ Select實例,這與之前由Ralph Schindler解決的這個問題非常相似https://github.com/zendframework/zf2/ issue / 5162#issuecomment-36294281

為了解決這個問題,您需要傳遞一個新的選擇對象,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM