2015-05-14 5 views
3

Я использую PHP с Zend Framework 2.3.3. Я использовал Paginator для a Выберите с Union. код выглядит так:ZF2 Pagination не работает с 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 в неправильном месте. Он должен быть в конце запроса. Это ошибка или есть ли способ решить эту проблему?

ответ

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()); 
+0

спасибо большое – Abadis