ZF2 :: Como fazer o UNION de selects? (SQL)

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.

CategoriasSem categoria

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.