php - La paginación ZF2 no funciona con Union
mysql pagination (1)
Estoy usando PHP
con Zend Framework 2.3.3
. Paginator
para un Select con un Union
. El código es así:
$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);
}
entonces recibo una cantidad incorrecta de productos. Revisé el registro de consultas de mysql y vi esta consulta:
( 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%'' )
como puede ver, el LIMIT 10 OFFSET 0
está en el lugar incorrecto. Debería estar al final de la consulta. ¿Es un error o hay alguna forma de resolver este problema?
Esto ocurre porque la selección se pasa al adaptador de paginación para la primera parte de la unión, por lo que la cláusula de límite se aplica a esa parte. Para permitir que la cláusula de límite se aplique al resultado de la unión, se requiere una nueva instancia de SQL / Select, esto es muy similar a este problema tratado anteriormente por Ralph Schindler https://github.com/zendframework/zf2/ issues / 5162 # issuecomment-36294281 .
Para arreglar esto, necesita pasar un nuevo objeto de selección como este:
$union = (new /Zend/Db/Sql/Select)->from([''sub'' => $select]);
$paginatorAdapter = new DbSelect($union, $this->getAdapter());