Olá pessoal!
Esta semana me deparei com um problema no trabalho. Precisava fazer consultas diferentes em várias tabelas e que ordenasse os resultados de acordo com essas consultas, tudo sendo exibido em um mesmo resultado. Nesse caso usei o UNION. Mas como usar o UNION no ZF2 (Zend Framework 2)? Eu explico.
O exemplo que colocarei abaixo será com o Paginator. Se não usas o Paginator, use a lógica que usei até o comentário “Aqui vai o Paginator”.
Primeiro você deve instanciar no método de seu Model que fará a consulta o objeto SQL e passar para ele como parâmetro o seu adapter.
Podes fazer algo como isso:
$sql = new Sql ( $adapter );
ou, no meu caso, isso:
$sql = new Sql ( $this->tableGateway->adapter );
Após feito isso, você deverá fazer algo como isso:
//Primeira Consulta
$selectA = $sql->select ( "nome_tabela" );
//Condição da pesquisa
$selectA->where ( $whereA );
//Segunda Consulta
$selectB = $sql->select ( "nome_tabela" );
//Condição da pesquisa
$selectB->where ( $whereB );
//Condição da pesquisa
$selectC = $sql->select ( "nome_tabela" );
$selectC->where ( $whereC );
// União dos dois primeiros SELECTS
$selectA->combine ( $selectB );
// União de todos os SELECTS
$select = $sql->select ();
$select->from ( array (
//Dou um Alias para a união das duas primeiras consultas
"selAeB" => $selectA
) );
//Combino a primeira união com o segundo select
$select->combine ( $selectC );
$adaptador = new DbSelect ( $select, $this->tableGateway->adapter );
//Aqui começa o Paginador
// Faz o adaptador da QUERY
$paginador = new Paginator ( $adaptador );
// Seta a página atual
$paginador->setCurrentPageNumber ( 1 );
$paginador->setItemCountPerPage ( 15 );
return $paginador; //Se esse for o final do método, é claro
É isso aí pessoal! Se alguém tiver alguma dúvida, pode postar aí. Se gostou do artigo, dá uma curtida!
Fonte:
StackOverflow. Resposta do usuário Abdel. Disponível em: http://stackoverflow.com/questions/13649648/select-union-in-zf2-query. Acesso em 08/04/2015.